Java:为什么线程不会终止

标签 java multithreading

我不明白为什么我的简单程序中的线程总是无法终止。 我认为这是一个简单的问题,但我不明白为什么。我认为一个简单的 exec.shutdown();应该关闭我的线程池,而不需要 exec.shutdownNow(); 的 try 和 catch;但她不确定。

类 1:测试(实现运行线程池的类)

public class test {


 public static void main(String[] args) throws InterruptedException{

    ExecServicrunnen x = new ExecServicrunnen();

    x.runningThreads();
    Thread.sleep(10000);
    x.getThreadtoStop();
 }
}

类 2:ExecServicerunnen(使用 MyTask() 作为 Runnable 实现线程池)

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


public class ExecServicrunnen {

private volatile boolean solange = true;


 public void runningThreads(){
    ExecutorService exec = Executors.newFixedThreadPool(5);

    while(solange){
        exec.execute(new myTask());


    }
    exec.shutdown();
    try{
        if(!exec.awaitTermination(60, TimeUnit.SECONDS)){
            exec.shutdownNow();
        }
    } catch ( InterruptedException e){
        e.printStackTrace();
        exec.shutdownNow();
            }
 }

 public void getThreadtoStop(){
    solange = false;
 }
}

类3:myTask(只是运行等待一段时间)

public class myTask implements Runnable{

public void run() {

// doSomething

try {
    Thread.sleep(10000);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

}

程序总是无法终止。

最佳答案

死锁。

x.runningThreads(); 在调用 x.getThreadtoStop(); 之前不会返回,但 x.getThreadtoStop();仅在 x.runningThreads(); 返回后调用。瞧,线程永远无法停止。

错误在于 runningThreads() 在主线程内同步运行,而不是在其自己的线程中运行。主线程在等待信号终止时无法向自身发送终止信号。

无需过多更改代码结构,您可以使用另一个线程来解决此问题,例如:

public class ExecServicrunnen implements Runnable {

  private volatile boolean solange = true;

  // Rename runningThreads() to run():
  @Override
  public void run() {
    // The former code of runningThreads() here...
  }

}

-

public class test {


  public static void main(String[] args) throws InterruptedException{

    ExecServicrunnen x = new ExecServicrunnen();

    // Have ExecServicrunnen run in its own thread:
    new Thread( x ).start();

    Thread.sleep(10000);

    x.getThreadtoStop();

  }

}

顺便说一句, boolean solange 逻辑在大多数情况下应该通过 Thread.interrupt() 实现和 Thread.currentThread().isInterrupted()相反。

关于Java:为什么线程不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34608568/

相关文章:

java - 通过多线程客户端使用 JMS

java.lang.NoClassDefFoundError : org/apache/commons/lang/StringUtils when deploying web application

java - 编写简单语言的解析器

java - 如何让所有线程仅在调用某个方法时等待

java - LinkedList队列和线程安全

java - sleep 线程唤醒后会发生什么?

Java Socket 仍然是 Java 中 TCP/IP 编程的首选?

java - 如何从其他模块测试 Maven 插件 (Mojo)

java - 为什么 Java 规范中没有定义 ThreadLocal 或 AnnotationProcessor?

java - 如何正确停止Java中的线程?