我有一个Thread工作类Java,它被启动了几次(可以说是10个实例)。现在我想按照它们创建的顺序逐个停止这些运行的线程(First in first)。所有这些线程对象都存储在ArrayList中。有谁可以帮忙。
提前致谢 利
答案 0 :(得分:1)
Thread.join()
方法用于相同目的。 Docs here
让我们说tou有线程T1,T2和T3。
要在T2之前完成T3并在T1之前完成t2,你需要从T1调用T2.join(),从T2调用T3.join()。您可以执行以下操作 -
public class ThreadSync extends Thread {
Thread waitForThread;
public void setWaitForThread(Thread waitForThread) {
this.waitForThread = waitForThread;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " Thread Started");
if(waitForThread != null)
waitForThread.join();
System.out.println(Thread.currentThread().getName() + " Thread Terminating");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
Thread t1 = new ThreadSync();
t1.setName("T1");
Thread t2 = new ThreadSync();
t2.setName("T2");
Thread t3 = new ThreadSync();
t3.setName("T3");
((ThreadSync)t3).setWaitForThread(t2);
((ThreadSync)t2).setWaitForThread(t1);
t1.start();
t2.start();
t3.start();
}
}
输出
T1 Thread Started
T3 Thread Started
T2 Thread Started
T1 Thread Terminating
T2 Thread Terminating
T3 Thread Terminating
答案 1 :(得分:0)
MyThread[] arr = new Thread[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = new MyThread();
arr[i].start();
}
for(int i = 0; i < arr.length; i++) {
arr[i].join();
}
这段代码的作用是无用的(实现yiur自己的用法)。 join()
等待线程正确死亡(到达run()
的末尾)。如果要强制终止线程,请使用stop()
,但不推荐使用它并且不安全。
答案 2 :(得分:0)
在大多数情况下,如果我管理自己的线程,我会在线程的每次运行时检查某种标志(例如,volatile布尔值或AtomicBoolean)。 E.g。
private volatile stop = false;
void stop(){
stop = true;
}
class Worker implements Runnable{
public void run(){
while(!stop){
... your logic
}
}
}
如果您的线程可能阻塞某些内容并且您需要让它们自由中断,则可以中断您的线程:
void stop(){
stop = true;
for(Thread thread: threads){
thread.interrupt();
}
}