我有以下代码
package threads;
import java.util.ArrayList;
import java.util.List;
public class Threads extends Thread implements Runnable {
private final List<Thread> threadList = new ArrayList<>();
private String f, l;
private Thread greetings1, greetings;
public static void main(String[] args) {
String[] elements = { "Tim", "Fred", "Jeff", "Scott" };
Threads t = new Threads();
for (String e : elements) {
t.threadL(e);
t.threadR(e);
}
for (int index = 0; index < t.threadList.size(); index++) {
// blank at the moment
}
}
public void threadR(String f) {
greetings = new Thread(f);
Thread greetingsFromFred = new Thread(greetings) {
@Override
public void run() {
for (int i = 1; i < 5; i++) {
try {
System.out.println("Main Thread: " + i + " " + f);
Thread.sleep(5000);
} catch (InterruptedException ex) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
};
greetingsFromFred.start();
}
public List<Thread> threadL(String l) {
greetings1 = new Thread(this);
this.l = l;
greetings1.start();
threadList.add(greetings1);
return (threadList);
}
@Override
public void run() {
greetings.interrupt(); // interrupt greetings thread here <-------
System.out.println("Greetings from " + l + "! threadL");
}
}
当 threadL 运行时,我想中断 threadR 的运行,因此导致
System.out.println("Main thread interrupted.");
从threadR打印
我已经在我的代码中突出显示了应该发生中断的地方
greetings.interrupt(); //interrupt greetings thread here <-------
为什么中断不能正常工作?
最佳答案
您的程序有点像线程对象的迷宫。让我们尝试从 main
开始。
在 main
中,您创建了一个类型为 Threads
的对象 t
。这意味着它是一个 Thread
和一个 Runnable
。
然后,对于您的每个字符串,您运行 t
的 threadL
和 threadR
并将该字符串作为参数。
main
中没有任何地方是您实际启动 t
,甚至直接运行它的 run
方法。
然后,在 threadR
中创建一个新的空 Thread
并将其分配给 greetings
。
然后您将那个新的空 Thread
(问候)用作 Runnable
,它被传递给一个新的 Thread
对象,该对象也有它的 run
方法被覆盖。这是徒劳的。在任何情况下,greetingsFromFred
都会启动,并将运行循环。但是 greetings
仍然包含与 greetingsFromFred
线程无关的空 Thread
。
在 threadL
中,您创建了另一个 Thread
,将当前 Thread
(即 t
在 main
) 中作为其可运行的。然后你终于开始了。它将尝试中断 greetings
中的线程,但正如我们所说,这是一个从未启动的非 Activity 空线程。
你的结构应该没有那么复杂。尽可能只对应该执行的事情使用 Runnable
对象。因此,Threads
本身应该是一个 Runnable
,而 threadR
应该固定为如下所示:
public void threadR(String f) {
Runnable greetingsFromFred = new Runnable() {
@Override
public void run() {
for (int i = 1; i < 5; i++) {
try {
System.out.println("Main Thread: " + i + " " + f);
Thread.sleep(5000);
} catch (InterruptedException ex) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
};
greetings = new Thread(greetingsFromFred, f);
greetings.start();
}
这样,greetings
将成为一个 Thread
,它将运行您在 Runnable
中创建的 循环,还有名字 f
。
但是请注意:由于您实际上并没有在 catch
子句中停止循环,因此当线程被中断时您不会退出循环,并且您可能会得到“Exiting "消息打印不止一次,具体取决于中断何时进入循环。
关于java - 线程和中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34575880/