Java多线程的join和interrupt方法

来源:互联网 发布:什么软件推广最好 编辑:程序博客网 时间:2024/06/06 20:04

Javajoin()官方的解释:

Waits for this thread to die.

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

假设现在有AB,线程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()方法的调用。 继续上面的AB线程,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");            }        }    }}

Taskrun方法中调用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线程被终止,主线程继续运行。

0 0
原创粉丝点击