1.InterruptException是个Exception啦,如果有相应的catch,就交给catch块,否则就向堆栈上方抛,一直抛到顶端中止整个程序。
2.根据javadoc上的说法,应该会收到InterruptedException,但是没有使用synchronized关键字,会产生一些问题
3.JVM可以调度一个线程进入阻塞状态,如果阻塞也可以看成中断的话
2.根据javadoc上的说法,应该会收到InterruptedException,但是没有使用synchronized关键字,会产生一些问题
3.JVM可以调度一个线程进入阻塞状态,如果阻塞也可以看成中断的话
对于1,我的理解是调用sleep或wait方法会使线程t进入被中断状态,如果这时候,有一个其他的线程调用了t的interrupt方法,这会使"中断调用(sleep/wait方法)"抛出InterruptedException异常.线程的状态,根据<<Core Java>>中描述,只有四种:new(新线程),runnable(可运行状态),blocked(阻塞,Java doc中称之为interrupted status--被中断)和dead(死亡).
所以你对他进行中断操作将不会有任何反应
如果是的话,那么请看:public class ThreadTest{
public static void main(String[] args) throws Exception{
//主线程
Thread t1 = new PrinterThread('X');
t1.start(); //实例化一个新线程,并启动之
Thread.sleep(340); //主线程sleep
t1.interrupt(); //在主线程中interrupt线程t1
}
}//一个线程类,简单地向控制台打印一个指定的字符
class PrinterThread extends Thread{
private char c;
public PrinterThread(char c){
this.c = c;
}
public void run(){
try{
while(true){
synchronized(System.out){
for(int i = 0; i < 10; i++)
System.out.print(c);
Thread.sleep(200); //该线程sleep
}
}
}catch(InterruptedException ex){
System.err.println(ex.getMessage());
}
}
}
编译运行它,输出为:
XXXXXXXXXXXXXXXXXXXXsleep interrupted可以看到线程处于sleep状态时被中断了的.
我认为sleep和wait就是某段时间内(如果指定了时间长度),该线程不会参与线程的调度,就是JVM线程调度不会考虑它。因为它不再是“就绪”状态。直到sleep或者wait正常结束,才重新进入“就绪”状态,才可能被调度进入“运行”状态。所以在sleep或者wait时实际是阻塞状态,而不是就绪状态,interrupt显然不起作用,因为interrupt只对就绪态起作用。
另外,我说的“中断”想表达的是“当前不运行”,不运行可能是就绪也可能是阻塞。从运行态转入就绪态可以是JVM自己调度的,如果这也算“中断”的话,那么这显然是interrupt之外的一种情况。