Java 多线程中断方法调用
我编写了一个java线程中断代码,但是通过调用中断方法,生成了异常,但是线程没有停止Java 多线程中断方法调用,java,multithreading,Java,Multithreading,我编写了一个java线程中断代码,但是通过调用中断方法,生成了异常,但是线程没有停止 public class MULTITHREADING_9 { public static void main(String[] args) { CHILD_THREAD childThread = new CHILD_THREAD(); childThread.start(); childThread.interrupt(); Sys
public class MULTITHREADING_9 {
public static void main(String[] args) {
CHILD_THREAD childThread = new CHILD_THREAD();
childThread.start();
childThread.interrupt();
System.out.println("MAIN_END");
}
}
public class CHILD_THREAD extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("I'AM A LAZY THREAD");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("CHILD_THREAD_INTERRUPTED");
}
}
}
}
interrupt
方法在线程睡眠时导致InterruptedException
。当捕获InterruptedException
时,您应该从方法返回(或者中断循环-这取决于您需要什么),以停止线程。
此外,在每次迭代中检查线程是否被另一个线程中断也是一种很好的方式:
Thread.currentThread().isInterrupted()
大概是这样的:
public class CHILD_THREAD extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("CHILD_THREAD_INTERRUPTED");
return;
}
System.out.println("I'AM A LAZY THREAD");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("CHILD_THREAD_INTERRUPTED");
return;
}
}
}
}
仍然有疑问,如果子线程被中断导致异常,为什么子线程不被停止。@LafhangaLadka,因为它只是抛出InterruptedException
,而您在catch
块中捕获它。线程不能立即停止,因为它可能持有任何资源,例如数据库连接。在那个挡块里,你必须在停止电流之前把它关上thread@LafhangaLadka,中断!=停止,因为中断只是线程的一个信号。尚未要求线程停止。线程不会停止,因为您正在捕获异常。中断只不过是线程之间的消息传递机制。从Java并发实践来看:“API或语言规范中没有任何东西将中断与任何特定的取消语义联系起来”。换句话说:被中断的任务需要对中断做出响应,取消才能正常工作。
public class CHILD_THREAD extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("CHILD_THREAD_INTERRUPTED");
return;
}
System.out.println("I'AM A LAZY THREAD");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("CHILD_THREAD_INTERRUPTED");
return;
}
}
}
}
public class CHILD_THREAD extends Thread {
@Override
public void run() {
try {
for (int i = 0; i < 5; i++) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("CHILD_THREAD_INTERRUPTED");
return;
}
System.out.println("I'AM A LAZY THREAD");
Thread.sleep(10000);
}
} catch (InterruptedException e) {
System.out.println("CHILD_THREAD_INTERRUPTED");
}
}
}