07.interrupt
发布时间:2020-12-15 08:02:52 所属栏目:Java 来源:网络整理
导读:/***isInterrupted*/public class InterruptDemo { public static void main(String[] args) throws InterruptedException{ Thread thread = new Thread(new Runnable() { @Override public void run() { while (!Thread.currentThread().isInterrupted()){
/** *isInterrupted */ public class InterruptDemo { public static void main(String[] args) throws InterruptedException{ Thread thread = new Thread(new Runnable() { @Override public void run() { while (!Thread.currentThread().isInterrupted()){ System.out.println(Thread.currentThread()+"没被中断"); } } }); thread.start(); Thread.sleep(1000); System.out.println("main thread interrupt thread"); thread.interrupt(); thread.join(); System.out.println("main is over"); //... //Thread[Thread-0,5,main]没被中断 //Thread[Thread-0,main]没被中断 //main thread interrupt thread //Thread[Thread-0,main]没被中断 //main is over } } /** * interrupt()方法打断线程的休眠 */ public class InterruptDemo2 { public static void main(String[] args) throws InterruptedException{ Thread threadOne = new Thread(new Runnable() { @Override public void run() { try { System.out.println("threadOne begin sleep for 200 s"); Thread.sleep(200000); System.out.println("threadOne waking"); } catch (InterruptedException e) { System.out.println("threadOne is interrupted while sleeping"); return; } System.out.println("threadOne-leaving normally"); } }); threadOne.start(); //确保子线程进入休眠状态 Thread.sleep(1000); //打断子线程的休眠,让子线程从sleep函数返回 threadOne.interrupt(); //等待子线程执行完毕 threadOne.join(); System.out.println("main thread is over"); //threadOne begin sleep for 200 s //threadOne is interrupted while sleeping //main thread is over // threadOne 线程休眠了200s,在正常情况下该线程需要等到 200s 后才会被唤醒, // 但是通过调用 threadOne.interrupt()方法打断了该线程的休眠, // 该线程会在调用 sleep 方法处抛出 InterruptedException 异常后返回 } } /** * interrupted() 与 isInterrupted() */ public class InterruptDemo3 { public static void main(String[] args) throws InterruptedException{ Thread threadOne = new Thread(new Runnable() { @Override public void run() { while (true){} } }); threadOne.start(); threadOne.interrupt(); System.out.println("isInterrupted:"+threadOne.isInterrupted()); System.out.println("isInterrupted:"+threadOne.interrupted()); System.out.println("isInterrupted:"+Thread.interrupted()); System.out.println("isInterrupted:"+threadOne.isInterrupted()); threadOne.join(); System.out.println("main thread is over"); //isInterrupted:true //isInterrupted:false //isInterrupted:false //isInterrupted:true // 在 interrupted()内部是获取当前调用线程的中断标志而不是调用 interrupted()方法的实例对象的中断标志。 // public static boolean interrupted() { // return currentThread().isInterrupted(true); // } //在 interrupted()方法内部是获取当前线程的中断状态,这里虽然调用了 threadOne 的 interrupted() 方法, //但是获取的是主线程的中断标志,因为主线程是 当前线程。 threadOne.interrupted()和 Thread.interrupted()方法的作用是一样的, // 目的都是 获取当前线程的中断标志 } } /** * interrupted() */ public class InterruptDemo4 { public static void main(String[] args) throws InterruptedException{ Thread threadOne = new Thread(new Runnable(){ @Override public void run() { //中断标志为true时会退出循环,并清除中断标志 while (!Thread.currentThread().interrupted()){} System.out.println("threadOne interrupted:"+Thread.currentThread().isInterrupted()); } }); threadOne.start(); threadOne.interrupt(); threadOne.join(); System.out.println("main thread is over"); //threadOne interrupted:false //main thread is over } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |