A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙传磊 中级黑马   /  2013-3-5 18:06  /  1615 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙传磊 于 2013-3-8 11:53 编辑

下面是一个关于线程面试题
public class MyClass extends Thread{
        public void run(){
                try{
                        for(int i=1;i<5;i++){
                                System.out.print(i+" ");
                                if(i>2)
                                        interrupt();
                                sleep(1000);
                                if(interrupted()) break;
                                
                        }
                }catch(InterruptedException e){
                        System.out.println("caught");
                }
        }

public static void main(String[] args){
        MyClass my=new MyClass();
        my.start();
}}
输出结果是:1 2 3 caught   答案的解释是在最后1个循环中,i 的值为3,此时设置中断标志,最后1个睡眠线程被调用,并抛出一个InterruptedException异常,之后打印出caught  
  这里不是只有 my线程和主线程吗?这里所说的最后一个线程是什么?
程序中的“if(interrupted()) break;"的作用是什么吗?程序会执行到这句,并从这里结束my线程吗?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 付玉光 于 2013-3-6 16:41 编辑

关于在我发的这个贴《[未解决] 多线程中有关interrupt(),interrupted(),isInterrupted()方法的问题 》

的时候,我还记得你给我,解答过,内容还挺多,但现在看来,你给我发的那些答案,你自己也不懂,

呵呵{:soso_e100:}

还是让我来给你回答一下吧,我的朋友,记得下次,回答我发的贴的时候要自己分析写出来,不要copy ,好吧?


程序中确实只有 my线程和主线程,这里所说的最后一个线程,是指my线程

在run方法的for循环中,i++=3后所运行的当前线程。


你说的这句话(“if(interrupted()) break;“)是不会执行的,

它的作用是清除中断状态后,让程序退出循环,但在本例中,

它的作用根本就没有体现出来,,因为当i=3时,还伦不到它执行,

sleep方法就已经抛出异常,由catch块捕获并处理了。


我们在程序中调用 interrupt()方法,程序并不会立刻停止运行,

知道为什么吗?让我来告诉你,那是因为该方法的声明上

并未有抛出InterruptedException 异常的声明,并不能使程序中断,

它只是改变了线程的中断标志,并不会让程序中断。

《《《
(线程的中断并不能保证中断线程)这句话,要好好体会!!{:soso_e100:}

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

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

试想当线程正在同步块中执行,你突然让它给停止了,这很容易产生数据的不完整,

即在提高处理数据效率的同时,也得保证数据的完整性!!
》》》

也就是说,当我们调用该方法后,是不会有中断异常的

只有在调用 wait , sleep ,  join方法后才会抛出异常,中断程序!!

(如果非要说有异常的话那么它也只能是在该函数内部给try了)因为

InterruptedException异常是Exception的一个《编译时异常的》子类(我查过了),

如果它不在函数内部给try了,则它肯定会把这个异常抛给调用处去处理,

这样一来它肯定得在interrupt函数上进行异常的抛出声明,

但该函数上并没有异常抛出的声明,所以它并不能中断线程。

明白了吧。{:soso_e100:}

我,辛辛苦苦,总结的,你一定要加分噢。{:soso_e100:}




评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 - -|||

查看全部评分

回复 使用道具 举报
付玉光 发表于 2013-3-5 23:41
关于在我发的这个贴《[未解决] 多线程中有关interrupt(),interrupted(),isInterrupted()方法的问题 》

的 ...

这地方我要消化一下啦!希望管理员给你加分吧

评分

参与人数 1黑马币 +20 收起 理由
付玉光 + 20 很给力!

查看全部评分

回复 使用道具 举报
孙传磊 发表于 2013-3-6 18:04
这地方我要消化一下啦!希望管理员给你加分吧

期待在黑马与你相识!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马