Java 如何从线程返回

Java 如何从线程返回,java,multithreading,Java,Multithreading,我正在尝试使用两个线程,第一个线程获取输入,第二个线程处理输入。 我无法找到如何在不使用回调的情况下从线程返回值的问题 回调的行为不像线程(我认为),所以我想知道如何做到这一点,并表示感谢 Thread t1 = new Thread() { public void input() { while (true) { while (true) { /* * get input using Scanner */ }

我正在尝试使用两个线程,第一个线程获取输入,第二个线程处理输入。 我无法找到如何在不使用回调的情况下从线程返回值的问题 回调的行为不像线程(我认为),所以我想知道如何做到这一点,并表示感谢

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();

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

当第二个线程具有可用于第一个线程的内容时,它应该引发一个事件。当创建第二个线程时,让第一个线程添加自己作为侦听器,然后第二个线程使用它来通知事件

这涉及到swing,但是您可以使用通用事件和侦听器来处理任何事情


如果您只有一个线程,您可能希望使用java.util.concurrent.FutureTask(前提是您使用java 1.5或更高版本)。

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

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

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

不要忘记使用互斥锁(这是一个关键部分)保护队列,或者多个线程可能同时使用(读/写)队列数据结构,从而导致各种奇怪的行为,如果幸运的话,这是一个简单的SIGSEGV信号:-)