黑马程序员技术交流社区

标题: 线程中断不是很明白 [打印本页]

作者: 傅宇    时间: 2013-3-7 14:26
标题: 线程中断不是很明白
void interrupt():把中断值修改为true;
boolean isInterrupted():获取中断值;
static boolean interrupted():获取中断值,并把中断值修改为false。
这三个方法该如何理解???
具体代码的体现是???
作者: 付玉光    时间: 2013-3-7 16:12
本帖最后由 付玉光 于 2013-3-7 16:17 编辑

//花了很长的时间给你总结了一下,{:soso_e100:}

//从该例中可证明,当前线程调用interrupt()方法并不能使,线程停止。

class MyClass1 extends Thread{
        public void run(){
                        for(int i=1;i<5;i++){
                                if(i>2)
                                        interrupt();
                                System.out.println(Thread.currentThread().getName()+" "+i);
                        }
        }

        public static void main(String[] args){
                        MyClass1 my=new MyClass1();
                        my.start();
        }
}

//该例证明:interrupted方法作用:是测试当前线程是否已经中断,线程的中断状态 由该方法清除。

class MyClass2 extends Thread{
        public void run(){
                try{
                                        for(int i=1;i<5;i++){
                                                System.out.print(i+" ");

                                                if(i>2)
                                                        interrupt();

                                                //该句作用:清除中断状态,使程序继续运行。
                                                interrupted();

                                                sleep(1000);
                                                        
                                        }
                }catch(InterruptedException e){
                        System.out.println("caught");
                }
        }

        public static void main(String[] args){
                        MyClass2 my=new MyClass2();
                        my.start();
        }
}

//isInterrupt方法的作用是:测试线程是否已经中断,如果已经中断,则返回 true;否则返回 false。

class MyClass3 extends Thread{

        public void run(){
                        int i=0;
                try{
                                        //如果中断,则退出循环。
                                        while(!isInterrupted()){
                                                ++i;
                                                System.out.println(Thread.currentThread().getName()+" "+i);
                                                if(i>4)
                                                        interrupt();
                                                sleep(1000);
                                                        
                                        }
                }catch(InterruptedException e){
                        System.out.println("结束");
                }
        }

        public static void main(String[] args){
                        MyClass3 my=new MyClass3();
                        my.start();
        }
}

//下面是文字说明


{:soso_e100:}好吧,就让 我 再 花 点 时间把这个问题,给你彻底的搞清楚吧。

interrupt方法:它是Thread类中的方法,该方法的作用是:把线程的运行状态改变为中断,

但当对象调用它时,并不用立即让线程停止运行。这点是很多人都不注意,

很多人都认为:线程的中断就是让线程停止.这其实是错误的观点,因为这只是改变了

线程的中断状态,线程并不会立即停止运行,当我们在一个线程对象上调用interrupt()方法,

真正有影响的是wait,join,sleep方法,当然也包括它们的重载方法。

你说的这三个方法都不会抛出InterruptedException,但受影响的wait,join,sleep方法

以即它们的重载形式将会抛出InterruptedException异常。

也就是说,如果一个线程被调用了interrupt()后,它的状态是已中断的.

这个状态对于正在执行wait,join,sleep方法的线程会受到影响,从而抛出中断异常。


为什么调用interrupt方法不会立即使线程停止运行呢?

那是因为多线程的产生目的是提高CPU的利用率(提高处理数据的效率),

但要提高效率(一个更重要)的前提也要保证处理数据的完整性,

给你举个例子,

synchronized void {
         x = 3;
         y = 4;
}
这个方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到

x = 3;时,被调用了interrupt方法使线程停止了,即使是在同步块中,它也不会去执行y=4,

而是直接停止,,这样就产生了不完整的残废数据,而这个结果并不是我们想要的,

所以interrupt方法只是改变了线程的中断状态,并不会使线程停止,如果你要非要

使线程在此处停止的话,你可以使用stop方法(该方法是不建议使用的方法,

原因就是因为该方法会使线程产生不完整数据)。


isInterrupt方法的作用是:测试线程是否已经中断,如果已经中断,则返回 true;否则返回 false。

interrupted方法为一个静态方法:它的作用是测试当前线程是否已经中断,线程的中断状态 由该方法清除。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2