如何逐个停止线程类的多个实例?

时间:2014-01-20 08:24:49

标签: java multithreading

我有一个Thread工作类Java,它被启动了几次(可以说是10个实例)。现在我想按照它们创建的顺序逐个停止这些运行的线程(First in first)。所有这些线程对象都存储在ArrayList中。有谁可以帮忙。

提前致谢 利

3 个答案:

答案 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(); 
    }
}