我想在一个线程中创建一个后台任务,并将该线程的信息发送到另一个运行主程序的线程,并在每个时间段更新信息。
线程1:
public void doTask()
{
// ...
someData = ...;
}
线程2:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new MainFrame(someData);
}
});
我怎样才能在java中实现这个目标?
答案 0 :(得分:3)
使用Java Concurrency API。使用BlockingQueue
s,Future<>
会对您有所帮助。
注意:这是一个典型的生产者 - 消费者问题。这可以通过共享队列来保持数据来实现,其中一个线程将数据推入队列,而另一个线程将消耗数据。需要适当的同步才能获得正确的解决方案。像BlockingQueue
这样的LinkedBlockingQueue
实施会很有帮助。
更新:部分问题[消费者]可以从我的this回答中获得。但此解决方案使用更简单的wait
- notify
方法。
答案 1 :(得分:2)
我使用Executor / ExecutorService,这些方法的输出从java.swing.Action开始(如果不存在则创建新的EDT),
或者您可以测试For EDT
if (SwingUtilities.isEventDispatchThread()) {...
你的Wratever的两种方式都应该始终在EDT中,我投票将包装输出到GUI Action
答案 2 :(得分:1)
Java没有直接机制让特定线程将消息发送到另一个SPECIFIC线程。
但是有一些间接的方法来实现这一目标。例如,您可以在一个线程上定义消息队列对象,然后将对该队列的引用传递给第二个线程。第二个线程可以将消息对象插入此队列;并且第一个线程可以继续轮询队列以使自己收到新消息的警报。
在这个帖子中也回答了
Communicating between two threads
以上链接有一些示例(伪)代码。
答案 3 :(得分:0)