我不明白为什么我的简单程序中的线程总是无法终止。 我认为这是一个简单的问题,但我不明白为什么。我认为一个简单的 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/