当前位置:编程学习 > JAVA >>

java多线程问题,希望大大指点迷津

关于线程的问题,代码如下,在循环中我想在i=3的时候调用interrupt()方法打断sleep。

疑问一:从interrupt字面上来看,应该是睡眠过程中打断,但实际上是睡眠完成后才执行打断,为什么会这样呢?都睡完了还叫打断么?

疑问二:代码中是在i=3的时候执行打断,按我理解这个时候就应该进catch了,应该输出“异常出现: i = 3”, 事实上,执行了interrupt()后,catch了下,但是没进catch代码块,而是把本次循环执行完了;在下一次循环中再catch,然后进catch代码块,所以输出了“异常出现: i = 4”。这又是为什么呢?

小弟着实迷茫,希望各位大大指点迷津!

public class ThreadTest extends Thread {
public void run(){
for(int i = 0; i< 10; i++){
try {
Thread.sleep(2000);
if(i == 3)
Thread.currentThread().interrupt();
} catch (InterruptedException e) {
System.out.println("异常出现: i = " + i);
return;
}


System.out.println(i);
}
}

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

输出如下:
0
1
2
3
异常出现: i = 4 thread java 线程 多线程 --------------------编程问答-------------------- 第一个疑问,你不觉得只有sleep结束了之后,才会运行到Thread.currentThread().interrupt();这一句么?
第二个。
i=3的时候并没有抛出异常,debug一步一步的下去你会观察到的。
是i=4的时候抛出的异常。

--------------------编程问答-------------------- sleep结束了后,线程不是有进入正常状态了么,要是这样的话何必要有sleep的情况下才能执行interrupt呢?直接不用sleep就interrupt不可以么?

第二个,我debug过的,是i=3的时候抛出异常,并且执行了catch语句,但是没进catch代码块,i=4的时候又执行了catch,这时候才进的。按代码的逻辑,不是应该i=3的时候就应该进catch的吗?

小弟愚钝 --------------------编程问答-------------------- 它只是被中断了,但是没有抛出异常,如果throw new interruptexception() 就会是3 了, try只会抓异常,你if(i==3)只是打断了现成而已 --------------------编程问答-------------------- 你在一个线程里是看不到效果的。在主线程里interrupt。 --------------------编程问答-------------------- 1、中断一般是2个线程之间的协作。像LZ这种同一个线程里,自己中断自己的情况,是达不到效果的。如果要达到效果,至少需要2个线程,我改了下:
package test;

public class ThreadTest extends Thread {
public void run() {
int i = 0;
for (; i < 10; i++) {
try {
if (i == 3)
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
System.out.println("异常出现: i = " + i);
return;
}
System.out.println(i);
}
}
}

package test;

public class MainThread extends Thread {
static ThreadTest t;

public void run() {
t.interrupt();
}

public static void main(String[] args) {
t = new ThreadTest();
t.start();

try {
System.out.println("主线程睡1秒(目的:保证t已经执行完3次循环,且已经sleeep),调用打断t的方法");
Thread.sleep(1000);
startInterrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}

}

private static void startInterrupt(){
MainThread tThread = new MainThread();
tThread.start();
}
}


2、中断作为一种协作机制,不会强求被中断线程一定要在某个点进行处理。例如,这里是i=3的时候发生了中断,但并Thread.currentThread()不一定马上就处理这个异常,而是会选择合适的时候来处理异常。
具体可以参考:
http://www.infoq.com/cn/articles/java-interrupt-mechanism --------------------编程问答-------------------- 你对for循环的执行顺序理解错误for(int i = 0; i< 10; i++)、当i<10后进入循环体,执行完里面的代码,然后才进行i++。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,