Java 线程与并发研究系列三(join()方法使用)
来源:互联网 发布:foxbot编程序软件 编辑:程序博客网 时间:2024/06/05 15:54
今天这个就来研究一个Java线程中join()方法以及interrupt()方法的使用。
线程A在线程B中调用join()方法的效果就是,线程B一直被挂起,直到等线程A执行完毕以后才继续执行,当然有join()方法中传入参数的,那就是
线程B被挂起多久,然后才开始执行。其中在调用join()方法的过程中,线程B是可以被中断的,做法就是在调用join()方法的线程上调用interrupt()
方法,但是会抛出一个异常。
interrupt()方法的作用其实不是中断线程,而是中断正在挂起的线程,使其唤醒。api中对interrupt()的描述是这样的,如果线程是调用下面方法被
阻塞的:wait(),join(),sleep()。调用interrupt()方法后将会抛出InterruptedException
异常,并且线程的interrupt status将会被清除,也就是
在抛出InterruptedException
异常后,调用interrupted()方法后将会返回false。
由上面的解释我们能够知道如果一个线程没有处于挂起的状态,调用interrupt()方法是无用的。
下面我看一看join()方法使用的小例子:
public class MyThread{public static void main(String[] args) {Sleeper sleeper =new Sleeper("Sleeper");Joiner joiner = new Joiner("joiner", sleeper);sleeper.interrupt();}}class Sleeper extends Thread{public Sleeper(String name){super(name);start();}@Overridepublic void run() {super.run();try {sleep(5000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(getName()+" isInterrupted():"+isInterrupted());System.out.println(getName()+"has awakened");}}class Joiner extends Thread{private Sleeper sleeper;public Joiner(String name,Sleeper sleeper) {super(name);this.sleeper = sleeper;start();}@Overridepublic void run() {super.run();try {sleeper.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(getName()+"join completed");}}
运行结果:
我们可以看见,在调用join()方法后,线程被挂起,调用interrupt()方法后,抛出InterruptedException异常,他的interrupt state状态被清除
变成 false,然后Sleeper线程被唤醒,执行完毕,然后Joiner线程再执行。
0 0
- Java 线程与并发研究系列三(join()方法使用)
- Java 线程与并发研究系列一Executor简介与使用
- Java 线程与并发研究系列五(生产者与消费者)
- Java 线程与并发研究系列二(实现Callable接口)
- Java 线程与并发研究系列四(多线程)
- Java 线程与并发研究系列六(死锁)
- Java 线程yield 与 join 方法区别
- Java线程5:join方法的使用
- Java系列-并发性与线程安全
- java线程并发包util.concurrent的研究(三)
- Java线程join方法
- 【Java】线程join方法
- Java并发系列(三)线程安全与对象的组合
- 基础篇:线程异常处理器与join方法(三)
- 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)
- 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)
- 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)
- 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)
- poj 1860 Bellman-Ford
- getSupportActionBar() 函数总是返回 null 的解决
- Solr fields sorting 排序相关(Integers, Longs, Floats, or String and multi-language 多语言相关)
- poj 2533 Longest Ordered Subsequence(最长上升子序列)
- 《Thinking in Java》狗血的学习笔记-3初始化
- Java 线程与并发研究系列三(join()方法使用)
- ZOJ-1374
- java利用爬虫技术抓取(省、市(区号\邮编)、县)数据
- 开源编程框架
- 1090: [SCOI2003]字符串折叠 (区间动态规划)
- bzoj1821 [JSOI2010]Group 部落划分 Group
- input的width和size同时存在问题
- NYOJ 1021 Fibonacci Again
- android 如何同时检测移动 长按事件