Java 爪哇:为什么不';t线程终止
我不明白为什么我的简单程序中的线程总是无法终止。 我认为这是一个容易的问题,但我不明白为什么。我认为一个简单的exec.shutdown();应该关闭线程池而不使用try-and-catch for exec.shutdownNow();但我不确定 类1:测试(实现运行线程池的类) 类2:ExecServicerunnen(实现一个线程池,其中MyTask()为Runnables) 第3类:myTask(正在运行等待一段时间) 程序总是无法终止 死锁Java 爪哇:为什么不';t线程终止,java,multithreading,Java,Multithreading,我不明白为什么我的简单程序中的线程总是无法终止。 我认为这是一个容易的问题,但我不明白为什么。我认为一个简单的exec.shutdown();应该关闭线程池而不使用try-and-catch for exec.shutdownNow();但我不确定 类1:测试(实现运行线程池的类) 类2:ExecServicerunnen(实现一个线程池,其中MyTask()为Runnables) 第3类:myTask(正在运行等待一段时间) 程序总是无法终止 死锁 x.runningThreads()在x.g
x.runningThreads()
在x.getThreadtoStop()之前不返回调用了code>,但是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...
}
}
-
顺便说一下,在大多数情况下,布尔solange
逻辑应该通过和来实现。死锁
x.runningThreads()
在x.getThreadtoStop()之前不返回调用了code>,但是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...
}
}
-
顺便说一句,在大多数情况下,布尔solange
逻辑应该通过和来实现。ah现在它确实编译了,为了更好地阅读,我更改了x处的方法名称,但忘记了更改对象本身的方法名称。尽管线程问题仍然存在。啊,现在它确实编译了,为了更好地阅读,我在x处更改了方法的名称,但忘记了更改对象本身中的方法名称。不过线程问题仍然存在。我如何避免这种情况?因为每当我在一个线程(main方法)中启动两个对象时,它都会同步执行。我可以在getThreadtoStop()中调用一个return或break,并将其放在runningThreads()之前,在那里等待计数器或将在ExecServicerunnen中初始化的任何东西,但我想有更好的解决方案。我如何避免这种情况?因为每当我在一个线程(main方法)中启动两个对象时,它都会同步执行。我可以在getThreadtoStop()中调用return或break,并将其放在runningThreads()之前,在那里等待计数器或任何将在ExecServicerunnen中初始化的内容,但我想有更好的解决方案。
public class myTask implements Runnable{
public void run() {
// doSomething
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
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();
}
}