让线程终止和程序结束执行的问题
Problem getting threads to terminate and program to end execution
我正在 java 中做一个简单的程序。
2 个线程应将它们的 id
附加到一个字符串,然后第三个线程对整个字符串进行哈希处理。这应该发生 5 次。它确实有效,问题是程序只是保持 运行 而不会停止执行。我已经尝试 break
但它仍然挂起。
我假设发生了某种僵局,但我不明白为什么或如何发生。
public void run()
{
while(numOfIterations > 0)
{
if (numOfIterations == 0){
break;
}
if(this.id == "A")
{
appendThread(this.id);
}
else if(this.id == "B")
{
appendThread(this.id);
}
else
{
hashThread();
}
try
{
Thread.sleep(interval);
if(this.nextThread.isAlive())
{
nextThread.interrupt();
}
else
{
nextThread.start();
}
Thread.sleep(Long.MAX_VALUE);
}
catch (InterruptedException e)
{
System.out.println("Interrupted Thread : "+ this.iD);
}
}
}
注意: run
方法在扩展线程的 class 内部,它有一个 属性 称为 nextThread
(基本上是对应该执行下一个任务的线程的引用。
thread1 -> thread2 -> thread3 -> thread1 ...).
方法 appendThread()
将 id 附加到字符串并 hashThread
散列字符串。
两种方法都将 numOfIterations
变量减少一个。
这是输出:
hashed word = b86fc6b051f63d73de262d4c34e3a0a9
numOfIterations : 4
Interrupted Thread : A
Interrupted Thread : B
Interrupted Thread : C
hashed word = a63e3d9e4d46287e71ec1248d1be5782
numOfIterations : 3
Interrupted Thread : A
Interrupted Thread : B
Interrupted Thread : C
hashed word = 444b8618908e49ca64c8eafab94add38
numOfIterations : 2
Interrupted Thread : A
Interrupted Thread : B
Interrupted Thread : C
hashed word = 535cfc91d9e96b57395000fdae460bf1
numOfIterations : 1
Interrupted Thread : A
Interrupted Thread : B
Interrupted Thread : C
hashed word = 3e9c9cfb98a356ff155fa67abbbaccb9
numOfIterations : 0
Interrupted Thread : A
输出是正确的,唯一的问题是程序没有结束。另外,请注意输出如何以 Interrupted Thread : A
而不是 B 或 C.
结尾
如有任何帮助,我们将不胜感激。
几个小时后,我弄清楚发生了什么。
由于每个线程都在等待被前一个线程中断,线程B和C在等待线程A唤醒它们时发生了死锁,但是A已经退出了函数。
最后打印 Interrupted Thread : A
的原因是线程 A 确实终止了它的方法,但线程 B 和 C 仍在休眠。
所以我只需要通过调用 nextThread.interrupt() 使线程 A 在线程 B 存在之前中断线程 B。这样 A 在退出方法之前唤醒 B,B 唤醒 C,因此所有线程都可以退出函数。
将这个添加到函数的末尾解决了我的问题。
if (numOfIterations == 0){
nextThread.interrupt();
}
您必须将其作为 try 中的 if 语句之一来执行:
if(this.nextThread.isAlive()) {
nextThread.interrupt();
}
else if (numOfIterations == 0){
break;
} else {
nextThread.start();
}
我正在 java 中做一个简单的程序。
2 个线程应将它们的 id
附加到一个字符串,然后第三个线程对整个字符串进行哈希处理。这应该发生 5 次。它确实有效,问题是程序只是保持 运行 而不会停止执行。我已经尝试 break
但它仍然挂起。
我假设发生了某种僵局,但我不明白为什么或如何发生。
public void run()
{
while(numOfIterations > 0)
{
if (numOfIterations == 0){
break;
}
if(this.id == "A")
{
appendThread(this.id);
}
else if(this.id == "B")
{
appendThread(this.id);
}
else
{
hashThread();
}
try
{
Thread.sleep(interval);
if(this.nextThread.isAlive())
{
nextThread.interrupt();
}
else
{
nextThread.start();
}
Thread.sleep(Long.MAX_VALUE);
}
catch (InterruptedException e)
{
System.out.println("Interrupted Thread : "+ this.iD);
}
}
}
注意: run
方法在扩展线程的 class 内部,它有一个 属性 称为 nextThread
(基本上是对应该执行下一个任务的线程的引用。
thread1 -> thread2 -> thread3 -> thread1 ...).
方法 appendThread()
将 id 附加到字符串并 hashThread
散列字符串。
两种方法都将 numOfIterations
变量减少一个。
这是输出:
hashed word = b86fc6b051f63d73de262d4c34e3a0a9
numOfIterations : 4
Interrupted Thread : A
Interrupted Thread : B
Interrupted Thread : C
hashed word = a63e3d9e4d46287e71ec1248d1be5782
numOfIterations : 3
Interrupted Thread : A
Interrupted Thread : B
Interrupted Thread : C
hashed word = 444b8618908e49ca64c8eafab94add38
numOfIterations : 2
Interrupted Thread : A
Interrupted Thread : B
Interrupted Thread : C
hashed word = 535cfc91d9e96b57395000fdae460bf1
numOfIterations : 1
Interrupted Thread : A
Interrupted Thread : B
Interrupted Thread : C
hashed word = 3e9c9cfb98a356ff155fa67abbbaccb9
numOfIterations : 0
Interrupted Thread : A
输出是正确的,唯一的问题是程序没有结束。另外,请注意输出如何以 Interrupted Thread : A
而不是 B 或 C.
如有任何帮助,我们将不胜感激。
几个小时后,我弄清楚发生了什么。 由于每个线程都在等待被前一个线程中断,线程B和C在等待线程A唤醒它们时发生了死锁,但是A已经退出了函数。
最后打印 Interrupted Thread : A
的原因是线程 A 确实终止了它的方法,但线程 B 和 C 仍在休眠。
所以我只需要通过调用 nextThread.interrupt() 使线程 A 在线程 B 存在之前中断线程 B。这样 A 在退出方法之前唤醒 B,B 唤醒 C,因此所有线程都可以退出函数。
将这个添加到函数的末尾解决了我的问题。
if (numOfIterations == 0){
nextThread.interrupt();
}
您必须将其作为 try 中的 if 语句之一来执行:
if(this.nextThread.isAlive()) {
nextThread.interrupt();
}
else if (numOfIterations == 0){
break;
} else {
nextThread.start();
}