您的位置:首页 > 编程语言 > Java开发

Java多线程的join和interrupt方法

2017-04-14 21:50 387 查看
Java
join()
官方的解释:

Waits for this thread to die.

等待当前线程直到当前线程结束。

假设现在有
A
B
,线程
A
在线程
B
内调用
A.join()
,那么线程
B
会被挂起,直到
A
线程完成后才恢复。

比如线程没有使用
join


public class TestJoin {
public static void main(String[] args) throws Exception {
TestJoin testJoin = new TestJoin();
Thread task = new Thread(testJoin.new Task());
System.out.println("Begin Time: " + new Date());
task.start();
System.out.println("Finish Time: " + new Date());
}

class Task implements Runnable {

@Override
public void run() {
try {
Thread.sleep(2000);
System.out.println("task: " + new Date());

} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}


控制台输出

Begin Time: Fri Apr 14 21:36:46 CST 2017

Finish Time: Fri Apr 14 21:36:46 CST 2017

task: Fri Apr 14 21:36:48 CST 2017

Task
线程最后完成,等待了
2s


task.start();
后面添加
task.join()


...
System.out.println("Begin Time: " + new Date());
task.start();
task.join();
System.out.println("Finish Time: " + new Date());
...


控制台输出

Begin Time: Fri Apr 14 21:38:36 CST 2017

task: Fri Apr 14 21:38:38 CST 2017

Finish Time: Fri Apr 14 21:38:38 CST 2017

可以看到主线程被挂起,等待了
2s
,直到
task
完成主线程才恢复。

使用
interrupt()
方法可以中断
join()
方法的调用。 继续上面的
A
B
线程,
A
线程调用了
join()
,导致
B
线程挂起,如果
A
线程调用
interrupt()
,则
A
线程被中断,抛出
InterruptedException
异常,
B
线程恢复。

现在修改
Task


public class TestJoin {
public static void main(String[] args) throws Exception {
TestJoin testJoin = new TestJoin();
Thread task = new Thread(testJoin.new Task());
System.out.println("Begin Time: " + new Date());
task.start();
task.join();
System.out.println("Finish Time: " + new Date());
}

class Task implements Runnable {

@Override
public void run() {
try {
Thread.currentThread().interrupt();
Thread.sleep(2000);
System.out.println("task: " + new Date());
} catch (InterruptedException e) {
System.out.println("Task is interrupted");
}
}
}
}


Task
run
方法中调用
Thread.currentThread().interrupt();


控制台输出

Begin Time: Fri Apr 14 21:45:11 CST 2017

Task is interrupted

Finish Time: Fri Apr 14 21:45:11 CST 2017

Task
线程被终止,主线程继续运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: