4、join与中断线程
来源:互联网 发布:淘宝达人官网 编辑:程序博客网 时间:2024/06/11 03:21
哪个线程对象调用这个join方法,表示哪个线程进入执行的状态,等待这个线程把它的任务执行完。
让调用的线程先执行指定时间或执行完毕后再执行其他的线程
应用场景:当主线程执行到一半,需要线程0返回的数据才能继续执行时。
package com.chocus.demo1;public class ThreadDemo02 { public static void main(String[] args) { MyRunnables mr = new MyRunnables(); Thread t = new Thread(mr); t.start(); for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "--" + i); try { Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(i == 5){ try { t.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}class MyRunnables implements Runnable { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "--" + i); try { Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}结果:
main--0Thread-0--0main--1Thread-0--1main--2Thread-0--2main--3Thread-0--3main--4Thread-0--4main--5Thread-0--5Thread-0--6Thread-0--7Thread-0--8Thread-0--9main--6main--7main--8main--9
中断分为正常中断和异常中断
interrupt中断线程并不能真正使线程中断,而是做了一个中断的标记
interrupted方法会清除线程的中断标记,调用一次后就会清除
sleep方法因为线程中断而抛出异常的同时会清除线程的中断标记
package com.chocus.demo1;public class ThreadDemo03 { public static void main(String[] args) { MyRunnable03 mr = new MyRunnable03(); Thread t = new Thread(mr); t.start(); for (int i = 0; i < 50; i++) { System.out.println(Thread.currentThread().getName() + "--" + i); try { Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (i == 10) { t.interrupt(); } } }}class MyRunnable03 implements Runnable { @Override public void run() { for (int i = 0; i < 50; i++) { System.out.println(Thread.currentThread().getName() + "当前中断状态为:" + Thread.interrupted()); boolean flag = Thread.interrupted(); System.out.println(flag); if (flag) { break; } System.out.println(Thread.currentThread().getName() + "--" + i); try { Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); Thread.currentThread().interrupt(); } } }}
结果
main--0Thread-0当前中断状态为:falsefalseThread-0--0main--1Thread-0当前中断状态为:falsefalseThread-0--1Thread-0当前中断状态为:falsemain--2falseThread-0--2Thread-0当前中断状态为:falsefalseThread-0--3main--3Thread-0当前中断状态为:falsefalseThread-0--4main--4Thread-0当前中断状态为:falsemain--5falseThread-0--5main--6Thread-0当前中断状态为:falsefalseThread-0--6Thread-0当前中断状态为:falsefalseThread-0--7main--7main--8Thread-0当前中断状态为:falsefalseThread-0--8main--9Thread-0当前中断状态为:falsefalseThread-0--9main--10Thread-0当前中断状态为:falsefalseThread-0--10Thread-0当前中断状态为:falsemain--11truemain--12main--13main--14main--15main--16main--17main--18main--19
上面的方式会受到线程执行速度及执行权的影响,并不一定会百分百成功中断。下面才用推荐的自定义的中断标记
package com.chocus.demo1;public class ThreadDemo04 { public static void main(String[] args) { MyRunnable04 mr = new MyRunnable04(); Thread t = new Thread(mr); t.start(); for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName() + "==" + i); try { Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (i == 10) { mr.flag = false; } } }}class MyRunnable04 implements Runnable { public boolean flag = true; public MyRunnable04() { flag = true; } @Override public void run() { for (int i = 0; i < 20; i++) { if (flag) { System.out.println(Thread.currentThread().getName() + "--" + i); } else { break; } try { Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
结果
main==0Thread-0--0main==1Thread-0--1Thread-0--2main==2Thread-0--3main==3main==4Thread-0--4main==5Thread-0--5main==6Thread-0--6main==7Thread-0--7main==8Thread-0--8main==9Thread-0--9main==10Thread-0--10main==11main==12main==13main==14main==15main==16main==17main==18main==19
阅读全文
1 0
- 4、join与中断线程
- 后台线程与join方法
- 线程的中断与终止
- 线程的中断与InterruptedException
- Java线程阻塞与中断
- java中 sleep线程睡眠 Join线程独占 Yeile 线程让步 Interrupt线程中断 Deamon后台线程
- 浅谈Java线程启动与Thread.join()
- 线程的优先级与join方法
- Java 线程yield 与 join 方法区别
- 线程join
- 线程 join
- 【线程】.join()
- C#线程阻塞、中断与终止
- 中断线程Interrupt与Interrupted的用处
- 线程的中断阻塞与控制
- java线程的终止与中断
- 《Java并发编程》之线程中断与终止线程运行
- 初识线程,与进程的区别和线程中断…
- Echarts绘制中国地图
- IPv6 源地址选择规则
- vue中使用轮播图 vue-awesome-swiper
- [MyBatis]诡异的Invalid bound statement (not found)错误
- 整理 前端向后端传输对象(对象中包含另一个对象数组)
- 4、join与中断线程
- 合理精简配置和设备的重要性
- 使用template.js处理数据
- Rancher创始人谈Docker,创新愈发困难,未来将何去何从?
- Spark2.2-Task序列化源码解析
- 神树桌面发布之后
- Android之Banner实现无限自动轮播图
- JAVA学习图谱
- Java(5-1)