线程中断:
(1)线程的中断,必须由线程内部自己来中断,外部只是设置中断标记
(2)interrupt() 在外部设置一个中断标记
(3)isInterrupted()测设线程是否中断(不清除标记) interrupted() 测试线程是否中断(清除中断标记)
(4)调用 wait()/join()/sleep()方法会清除中断标记,并抛出InterruptedException 。
(5)根据线程中断的原理,通常我们可以在线程中定义一个标记,在外部通过设计标记来中断线程(推荐)。
具体代码实现1:
public class RunnableDemo {
public static void main(String [] args ) {
Mythread2 t2=new Mythread2 ();
Thread thread2=new Thread (t2);
thread2 .setName( "线程二" );
thread2 .start() ;
for (int i = 0; i < 10; i++) {
if (i== 5) {
t2 .setflag( false);//将中断标记设为false
}
System .out. println(Thread .currentThread() .getName() +"--->"+ i);
try {
Thread .sleep( 500);
} catch (InterruptedException e) {
e .printStackTrace() ;
}
}
}
//静态内部类相当于外部类,只有内部类可以被静态和私有修饰
static class Mythread2 implements Runnable {
//中断线程时只能由线程自身中断自身,而不能由其他的线程来直接中断
private boolean flag= true;//设置中断标记
public void setflag( boolean f ){//外部方法可以通过调用此方法来设置中断标记
flag=f ;
}
public void run() {
int i =0;
while(flag && i <10) {//自身中断
System .out. println(Thread .currentThread() .getName() +"--->"+ i);
i ++;
try {
Thread .sleep( 500);
} catch (InterruptedException e) {
e .printStackTrace() ;
}
}
}
}
}
具体代码实现2:
public class JiShiQi {
public static void main(String [] args ) {
Runner3 thread3=new Runner3 ();
Thread t=new Thread (thread3) ;
t .start() ;
try {
Thread .sleep( 10000);
} catch (InterruptedException e) {
}
thread3 .flag= false;
}
}
class Runner3 implements Runnable {
public boolean flag= true;
public void run() {
while(flag ){
try {
Thread .sleep( 1000);
System .out. println("-----------" +new Date()+ "---------------------");
} catch (InterruptedException e) {
return ;
}
}
}
}
|
|