一段关于线程代码的思考

由于是第一次在技术坛发帖,写的不好请各位大大勿拍!


public class InterruptTest extends Thread{
static int result=0;
public InterruptTest(String name)
{
super(name);
}
public static void main(String args[])
{
    System.out.println("开始主线程");
    Thread t1 = new InterruptTest("计算机线程");
    t1.start();
    //System.out.println("result:"+result);
    try {
        long time1 = System.nanoTime();
        t1.join(2000);
        long time2 = System.nanoTime();
        t1.interrupt();//中断线程
        System.out.println((time2-time1)/1000000+"毫秒后"+result);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public void run()
{
    System.out.println(this.getName()+"开始计算......");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        System.out.println(this.getName()+"线程被中断......");
        return;
        //e.printStackTrace();
    }
    result = (int)(Math.random()*10000);
    System.out.println("------"+result);
    System.out.println(this.getName()+"结束计算.....");
}

}


console的输出信息为:

按照正常情况来说的话,线程interrupt后,后面的语句应该是不执行的。以前对线程总是半知半解的,这次希望大家给我解解惑!

问题补充
悲剧了 写道
哥们你 Thread t1 = new JoinTest("计算机线程"); 
中JoinTest来自哪?

额,不好意思,写错了!
问题补充
恩,线程中断之后应该是不会执行后面的语句了吧?
问题补充
悲剧了 写道
java_xiaoyi 写道
恩,线程中断之后应该是不会执行后面的语句了吧?

你说的是这个么?
System.out.println((time2 - time1) / 1000000 + "毫秒后" + result);
如是,你只是中断你的t1线程,关main线程什么事情


不是这个,因为我在主线程里调用了join方法,然后突然interupt掉,这个时候在run方法应该会报异常,进入到catch里面去,输出"System.out.println(this.getName()+"线程被中断......");"这个吧?
问题补充
引用

不中断的原因是你的join时间太长, 改成t1.join(800)

明白了!哎,现在知道这个帖子太烂了~~ 下次发帖一定注意!
问题补充
blackbeans 写道
哥们你这个程序在
t1.interrupt();//中断线程 
这一步的时候Thread.sleep(1000)已经过期了,从sleep可中断块已经走出来了,而这个时候interrupt是已经失效了,interrupt只能打断能够接收中断的信号的操作,比如阻塞的take(),poll()这些

你的意思是说不能中断sleep的操作?
问题补充
悲剧了 写道
java_xiaoyi 写道
引用

不中断的原因是你的join时间太长, 改成t1.join(800)

明白了!哎,现在知道这个帖子太烂了~~ 下次发帖一定注意!


没事,大家都是这么过来的,只要态度好就很好

呵呵,共勉!
问题补充
icewubin 写道
实际工作中,一般不使用interrupt这种方式。

冰神,你太全能了吧,编程也懂?

15个回答

[quote="java_xiaoyi"][quote="悲剧了"][quote="java_xiaoyi"]恩,线程中断之后应该是不会执行后面的语句了吧?[/quote]
你说的是这个么?
System.out.println((time2 - time1) / 1000000 + "毫秒后" + result);
如是,你只是中断你的t1线程,关main线程什么事情

[/quote]
不是这个,因为我在主线程里调用了join方法,然后突然interupt掉,这个时候在run方法应该会报异常,进入到catch里面去,输出"System.out.println(this.getName()+"线程被中断......");"这个吧?[/quote]

不中断的原因是你的join时间太长, 改成t1.join(800)

哥们你 Thread t1 = new JoinTest("计算机线程");

中JoinTest来自哪?

我把JoinTest换成InterruptTest 结果如下:
开始主线程
计算机线程开始计算......
------5572
计算机线程结束计算.....
1012毫秒后5572

[quote="java_xiaoyi"]恩,线程中断之后应该是不会执行后面的语句了吧?[/quote]
你说的是这个么?
System.out.println((time2 - time1) / 1000000 + "毫秒后" + result);
如是,你只是中断你的t1线程,关main线程什么事情

[quote="java_xiaoyi"][quote]
不中断的原因是你的join时间太长, 改成t1.join(800)
[/quote]
:cry: 明白了!哎,现在知道这个帖子太烂了~~ :oops: 下次发帖一定注意![/quote]

没事,大家都是这么过来的,只要态度好就很好

哥们你这个程序在
t1.interrupt();//中断线程

这一步的时候Thread.sleep(1000)已经过期了,从sleep可中断块已经走出来了,而这个时候interrupt是已经失效了,interrupt只能打断能够接收中断的信号的操作,比如阻塞的take(),poll()这些

实际工作中,一般不使用interrupt这种方式。

[quote="java_xiaoyi"][quote="icewubin"]实际工作中,一般不使用interrupt这种方式。[/quote]
冰神,你太全能了吧,编程也懂? :o [/quote]
我学Java有12年了,用于工作10年了,你说我懂不懂?

否则一个电脑圈子怎么会开在JE?我第一次上JE是N年以前了。

interrupt只会中断被阻塞的操作,对其他操作没有影响。但就jdk支持所有阻塞操作,尤其是访问物理资源的操作能够被中断,JDK也为此付出了不少代价。但即使是这样,中断一个你不能确定它正做什么事情的线程,也是一个不可控,没谱的事情。对一个相对复杂得系统来说,使用这种机制是存在不确定风险的。正如楼上所说,最好不要用线程中断,尽量用其他方式去解决问题。

[quote="icewubin"]实际工作中,一般不使用interrupt这种方式。[/quote]

那用哪种方式?

共15条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐