如何从线程返回

时间:2014-09-18 11:50:52

标签: java multithreading

我正在尝试使用两个线程,形成第一个获取输入和第二个过程输入。 把问题我找不到如何在不使用回调的情况下从线程返回值 一个回调不像一个线程(我认为)所以任何好主意如何做到这一点,谢谢。

Thread t1 = new Thread() {
  public void input() {
    while (true) {
      while (true) {
      /*
       *  get input using Scanner
       */
      }
    }
  }
};

t1.start();
Thread t2 = new Thread() {
  public void input() {
    while (true) {
      while (true) {
      /* get input form above than
       * swith something or do something
       */
      }
    }
  }
};

t2.start();

4 个答案:

答案 0 :(得分:2)

使用共享的BlockingQueue。第一个线程(生产者)将输入添加到队列,第二个(消费者)从队列中获取它们。正如其名称所示,BlockingQueue正在阻塞。因此,消费者从队列中获取下一个元素将一直阻塞,直到队列实际包含一个元素。

答案 1 :(得分:0)

第二个帖子应该在第一个帖子有可用内容时引发一个事件。在创建第二个线程时,让第一个线程将自己添加为侦听器,然后第二个线程使用它来表示事件。

这谈到了摇摆,但你可以使用通用事件和听众。

http://docs.oracle.com/javase/tutorial/uiswing/events/

答案 2 :(得分:0)

如果您只有一个线程,则可能需要使用java.util.concurrent.FutureTask(假设您使用的是Java 1.5或更高版本)。

答案 3 :(得分:0)

阻塞队列是这种情况下的首选设计

生成生产者线程并让他们将数据插入队列。另一个线程(或主线程),消费者,将“旋转锁定”观察队列中的数据:一旦数据到达,消费者将抓住它并使用它。

因此,您的线程通过将数据插入此公共数据结构(队列)来“返回”数据。

不要忘记使用互斥锁(它是一个关键部分)保护您的队列,或者多个线程可以同时使用(读/写)队列数据结构导致所有类型的奇怪行为,如果是一个普通的SIGSEGV信号,你很幸运:-)