Java停止线程从类运行的所有线程

时间:2013-01-09 21:29:03

标签: java

我需要做的是能够阻止从一个实现runnable的线程类运行的所有线程。这就是我的意思:这是我的“线程”类的开头:

public class HTTP extends Thread
{   
    int threadNumber;
    String host;
    int port;
    int timeLeft;
    private BufferedReader LocalBufferedReader;

    public HTTP(int threadNumber, String host, int port, int timeLeft)
    {
        this.threadNumber = threadNumber;
        this.host= host;
        this.port = port;
        this.timeLeft = (timeLeft * 1000);
    }

  public void run()
  {

这就是我创建多个线程的方法:

 for (int n = 1; n <= m; n++) {
      new HTTP(n + 1, str, j, k).start();
    }

m是要创建的线程数。这可以是50-1000。现在我需要做的就是突然停止所有这些。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:9)

首先存储所有线程:

ArrayList<Thread> threads = new ArrayList<Thread>();
for (int n = 1; n <= m; n++) {
    Thread t = new HTTP(n + 1, str, j, k);
    threads.add(t);
    t.start();
 }

现在对于stop方法,只需循环所有线程并在它们上调用中断:

for(Thread thread : threads)
{
    thread.interrupt();
}

确保在HTTP线程中检查isIntruppted()。所以你会做这样的事情:

public class InterruptTest {

    static class TThread extends Thread {
        public void run() {
            while(!isInterrupted()) {
                System.out.println("Do Work!!!");
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    return;
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t = new TThread();
        t.start();

        Thread.sleep(4000);
        System.out.println("Sending interrupt!!");
        t.interrupt();
        Thread.sleep(4000);
    }

}

答案 1 :(得分:3)

在Java中停止线程是一个通过中断实现的协作过程。您可以存储线程并逐个中断它们:

List<Thread> threads = new ArrayList<> ();

for (int n = 1; n <= m; n++) {
  Thread t = new HTTP(n + 1, str, j, k);
  threads.add(t);
  t.start();
}

//later on

for (Thread t : threads) {
    t.interrupt();
}

然而,值得注意的是:

  • 仅当您的run方法通过停止正在执行的操作对中断做出反应时,此方法才有效
  • 您可以使用线程池更轻松地执行相同的操作,例如使用ExecutorService类提供的各种工厂方法返回的Executors之一。他们确实会为你处理线程的生命周期。

答案 2 :(得分:3)

首先,启动1000个线程实际上毫无意义,因为很少有线程会被安排实际同时运行。

其次,你不能“停止”线程。你所能做的就是通过合作代码很好地问他们。

执行所需操作的最简单方法是关闭JVM。