我遇到了问题。当我的程序启动时,一个线程启动,然后在这个线程中我正在等待发生的事情(实际上它是一个服务器线程,它等待有人连接到它然后另一个线程应该启动)然后另一个线程应该启动。换句话说,从一个线程我必须以某种方式发送另一个线程应该启动的消息(第一个仍然在运行)。我对多线程编程很陌生,所以我非常感谢你的帮助!
答案 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示例提供了一种非常简单的方法来实现这一目标。