java中的线程 - 如何从下一个应该开始的一个线程发送信息

时间:2014-12-14 19:50:50

标签: java multithreading

我遇到了问题。当我的程序启动时,一个线程启动,然后在这个线程中我正在等待发生的事情(实际上它是一个服务器线程,它等待有人连接到它然后另一个线程应该启动)然后另一个线程应该启动。换句话说,从一个线程我必须以某种方式发送另一个线程应该启动的消息(第一个仍然在运行)。我对多线程编程很陌生,所以我非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

最简单的方法是通过队列传递消息。我建议你使用一个包装队列和线程池的ExecutorService。

ExecutorService es = Executors.new.....
es.submit(new Runnable() {
    public void run() {
        // a task you want to pass to another thread
    }
});

如果你需要等待来自这个帖子的回复,你可以提交一个Callable。

Future<Type> future = es.submit(new Callable<Type>() {
    public Type call() {
        // do something and return a Type object.
    }
});
// do something while waiting otherwise there is no point using another thread.
Type type = future.get();

答案 1 :(得分:0)

您可以使用CountDownLatch或Cyclic Barrier来实现此功能(这些API在Java 1.5中实现)

**Main Class**:
CountDownLatch latch = new CountDownLatch(3);

Waiter      waiter      = new Waiter(latch);
Decrementer decrementer = new Decrementer(latch);
new Thread(waiter)     .start();
new Thread(decrementer).start();
Thread.sleep(4000);



    public class Waiter implements Runnable{
       CountDownLatch latch = null;
       public Waiter(CountDownLatch latch) {
           this.latch = latch;
       }

       public void run() {
           try {
               latch.await();
           } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Waiter Released");
      }
    }


    public class Decrementer implements Runnable {

    CountDownLatch latch = null;

    public Decrementer(CountDownLatch latch) {
        this.latch = latch;
    }

    public void run() {

        try {
            Thread.sleep(1000);
            this.latch.countDown();

            Thread.sleep(1000);
            this.latch.countDown();

            Thread.sleep(1000);
            this.latch.countDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
      }
    }

通过使用一些通用标志和同步(等待/通知)机制,您可以实现此目的的另一种传统方式。当发生特定情况时,我们将重置标志并通知其他等待线程。 但上面的CountDownLatch示例提供了一种非常简单的方法来实现这一目标。