当前位置: 编程技术>java基本教程之多线程基本概念 java多线程教程
iis7站长之家
Java线程中断的本质深入理解
来源: 互联网 发布时间:2014-10-22
本文导语: 一、Java中断的现象 首先,看看Thread类里的几个方法: public static boolean interrupted 测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调...
一、Java中断的现象
首先,看看Thread类里的几个方法:
public static boolean interrupted 测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。 public boolean isInterrupted() 测试线程是否已经中断。线程的中断状态 不受该方法的影响。 public void interrupt() 中断线程。
上面列出了与中断有关的几个方法及其行为,可以看到interrupt是中断线程。如果不了解Java的中断机制,这样的一种解释极容易造成误解,认为调用了线程的interrupt方法就一定会中断线程。
其实,Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己。每个线程都有一个boolean的中断状态(不一定就是对象的属性,事实上,该状态也确实不是Thread的字段),interrupt方法仅仅只是将该状态置为true
public class TestInterrupt {
public static void main(String[] args) {
Thread t = new MyThread();
t.start();
t.interrupt();
System.out.println("已调用线程的interrupt方法");
}
static class MyThread extends Thread {
public void run() {
int num = longTimeRunningNonInterruptMethod(2, 0);
System.out.println("长时间任务运行结束,num=" + num);
System.out.println("线程的中断状态:" + Thread.interrupted());
}
private static int longTimeRunningNonInterruptMethod(int count, int initNum) {
for(int i=0; i
Java中多线程相关类Thread介绍
java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了
输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
java基本教程之多线程基本概念 java多线程教程
请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
用什么方法可以查看在windows下jvm下运行当前java程序的线程数和线程名称?
java多线程编程之捕获子线程异常示例
java线程怎么调用java的application.class?
java多线程编程之使用runnable接口创建线程
java线程中如何降低CPU的占用率?我这几个线程会不会死锁?
java线程之使用Runnable接口创建线程的方法
java 多线程问题
Java线程的相关方法详细解析
紧急求助java多线程编程!!!!!!!!!!!!!
java线程,回答得比较深就好了
Java多线程之中断线程(Interrupt)的使用详解
关于java线程调度优先级
java基本教程之线程让步 java多线程教程
Java多线程单元测试 Thread Weaver
求教JAVA中的延时函数!不是用于线程中的!
首先,看看Thread类里的几个方法:
public static boolean interrupted 测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。 public boolean isInterrupted() 测试线程是否已经中断。线程的中断状态 不受该方法的影响。 public void interrupt() 中断线程。
上面列出了与中断有关的几个方法及其行为,可以看到interrupt是中断线程。如果不了解Java的中断机制,这样的一种解释极容易造成误解,认为调用了线程的interrupt方法就一定会中断线程。
其实,Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己。每个线程都有一个boolean的中断状态(不一定就是对象的属性,事实上,该状态也确实不是Thread的字段),interrupt方法仅仅只是将该状态置为true
代码如下:
public class TestInterrupt {
public static void main(String[] args) {
Thread t = new MyThread();
t.start();
t.interrupt();
System.out.println("已调用线程的interrupt方法");
}
static class MyThread extends Thread {
public void run() {
int num = longTimeRunningNonInterruptMethod(2, 0);
System.out.println("长时间任务运行结束,num=" + num);
System.out.println("线程的中断状态:" + Thread.interrupted());
}
private static int longTimeRunningNonInterruptMethod(int count, int initNum) {
for(int i=0; i