Java 如何使用join()/wait()/notify组合按特定顺序结束线程?
假设我有3个线程实现了一个可运行的接口,我已经用下面的语句启动了它们Java 如何使用join()/wait()/notify组合按特定顺序结束线程?,java,multithreading,Java,Multithreading,假设我有3个线程实现了一个可运行的接口,我已经用下面的语句启动了它们 t1.start(); t2.start(); t3.start(); 有没有任何方法可以使用join()、wait()、notify()组合使线程按t3、t2、t1的顺序结束?没有,线程将根据其run()方法实现内部发生的情况终止。如果您只获得了一个当前正在运行的线程,而没有任何对它正在执行的代码的访问权限,那么就没有办法强制它终止(除了调用stop()或destroy(),这两个线程都已弃用,不应使用) 但是,如果您可
t1.start();
t2.start();
t3.start();
有没有任何方法可以使用
join()
、wait()
、notify()
组合使线程按t3、t2、t1的顺序结束?没有,线程将根据其run()
方法实现内部发生的情况终止。如果您只获得了一个当前正在运行的线程,而没有任何对它正在执行的代码的访问权限,那么就没有办法强制它终止(除了调用stop()
或destroy()
,这两个线程都已弃用,不应使用)
但是,如果您可以编写这些线程正在运行的代码,那么就非常简单:
Thread t3 = new Thread(() -> {
System.out.println("Thread 3 terminating...");
});
Thread t2 = new Thread(() -> {
try { t3.join(); } catch(InterruptedException e) {};
System.out.println("Thread 2 terminating...");
});
Thread t1 = new Thread(() -> {
try { t2.join(); } catch(InterruptedException e) {};
System.out.println("Thread 1 terminating...");
});
t1.start();
t2.start();
t3.start();
听起来你可能想要一个生产者-消费者模型
BlockingQueue<Callable<Boolean>> queue1 = new LinkedBlockingQueue<>();
Thread t1 = new Thread(()->{
//do work.
queue1.add(()-> someTask() );
//do more work.
queue1.add(()-> someTaskThatReturnsFalse() );
}).start();
Thread t2 = new Thread(()->{
boolean shouldBeRunning = true;
while(shouldBeRunning){
Callable<Boolean> r = queue1.poll();
shouldBeRunning = r.call();
}
}).start();
BlockingQueue queue1=新建LinkedBlockingQueue();
线程t1=新线程(()->{
//干活儿。
queue1.add(()->someTask());
//做更多的工作。
queue1.添加(()->someTaskThatReturnsFalse());
}).start();
线程t2=新线程(()->{
布尔值shouldBeRunning=true;
同时(应该运行){
可调用的r=queue1.poll();
shouldBeRunning=r.call();
}
}).start();
您可以有任意数量的队列。使用锁和屏障还有其他方法。这可以使用join/wait/notify来完成,但实际上您将重新创建
LinkedBlockingQueue
。线程通常在其run
方法终止时终止。你到底想实现什么?鉴于线程是同时启动的,我需要一个工作代码,使线程使用join/wait/notify以所述顺序结束。这是你已经告诉我们的。我问你:你想解决什么问题?线程异步运行。那么,为什么要考虑一个命令,特别是关于结束那些线程的命令呢?您的问题看起来像一个控制流。您可以通过多种方式执行此控制流。你想要生产者-消费者模型吗?或者你可以使用信号灯或倒计时闩锁?为什么你有3个线程?你需要5根线吗?你需要什么样的控制,比如t1如何知道它何时完成,t3等等。所以你要做的不是以特定的顺序终止,而是以特定的顺序开始,但一定要在你的run方法的末尾放上连接,否则你只会阻塞一个线程,直到其他线程完成,这里你不是要求线程完成,但是你要求他们不要在别人之前完成这项工作。谢谢。我不知道为什么这个答案没有用。从ops的描述来看,“…每一个都填充了不同的结果”,听起来就像一个制作人。“其他线程必须等待结果可用”听起来像消费者。