创建2个线程并在它们之间进行通信

时间:2011-08-25 05:45:22

标签: java multithreading swing timer

我想在一个线程中创建一个后台任务,并将该线程的信息发送到另一个运行主程序的线程,并在每个时间段更新信息。

线程1:

public void doTask()
{
    // ...
    someData = ...;
}

线程2:

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        new MainFrame(someData);
    }
});

我怎样才能在java中实现这个目标?

4 个答案:

答案 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)

对于这种情况,这可能是一种过度设计的方法,但是你可以使用EventBus - 每个线程都可以发布并订阅事件。

一个例子是here