Thread的join方法

来源:互联网 发布:淘宝店怎么发布宝贝 编辑:程序博客网 时间:2024/05/24 00:43

线程的join方法,触发时可以让调用join方法的线程强制获得CPU运行资源,并在该线程死亡后运行其他资源。我将用join方法实现三个线程的顺序执行(确实,利用join方法可以让多线程顺序执行)。首先来看看join方法的一个简单的实现,从中体会下join方法的效果。join方法有两种形式,一种是带参数的join方法(带参数的join方法,表示在调用join方法后 N 毫秒后该线程强制获得CPU资源。),一个是不带参数的join方法,表示在调用join方法后 该线程立即强制获得CPU资源。下面的代码实现我用的是无参的join方法,带参数的join方法代码也是一样的。

1 新建一个实现Runable接口的类

public class Task implements Runnable{@Overridepublic void run() {for(int i=0;i<30;i++){System.out.println(Thread.currentThread().getName()+"正在运行-"+i);}}}

2 新建一个测试类

public class Test {public static void main(String[] a){Thread t1 = new Thread(new Task(),"测试线程1");t1.start();for(int i=0;i<20;i++){if(i>10){//在此之前,主线程和测试线程1将会交替获取CPU资源,但是在t1.join()后,//测试线程1强制获取CPU资源,直到测试线程1死亡后,主线程才继续运行try {t1.join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("main线程正在运行"+i);}}}
运行结果;

main线程正在运行0 //测试线程1与主线程交替获得CPU
测试线程1正在运行-0
main线程正在运行1
测试线程1正在运行-1
main线程正在运行2
测试线程1正在运行-2
main线程正在运行3
测试线程1正在运行-3
main线程正在运行4
测试线程1正在运行-4
测试线程1正在运行-5
main线程正在运行5
测试线程1正在运行-6
main线程正在运行6
测试线程1正在运行-7
main线程正在运行7
测试线程1正在运行-8
main线程正在运行8
测试线程1正在运行-9
main线程正在运行9
测试线程1正在运行-10
main线程正在运行10 //当main线程运行大于10后 测试线程1强制获得CPU资源,继续完成测试线程1 的任务
测试线程1正在运行-11
测试线程1正在运行-12
测试线程1正在运行-13
测试线程1正在运行-14
测试线程1正在运行-15
测试线程1正在运行-16
测试线程1正在运行-17
测试线程1正在运行-18
测试线程1正在运行-19
测试线程1正在运行-20
测试线程1正在运行-21
测试线程1正在运行-22
测试线程1正在运行-23
测试线程1正在运行-24
测试线程1正在运行-25
测试线程1正在运行-26
测试线程1正在运行-27
测试线程1正在运行-28
测试线程1正在运行-29  //当 测试线程1死亡后,主线程继续运行
main线程正在运行11
main线程正在运行12
main线程正在运行13
main线程正在运行14
main线程正在运行15
main线程正在运行16
main线程正在运行17
main线程正在运行18
main线程正在运行19

从上面的记过可以看到效果,join方法可以让可运行的线程(不管是等待还是正在运行)强制获得CPU。

下面我将实现一个多线程的顺序执行。

新建一个测试类 在每个线程启动后调用join方法(强制获得CPU,其他线程不会在此期间得到CPU),再开启其他线程

public class Test {public static void main(String[] a){Thread t1 = new Thread(new Task(),"测试线程1");t1.start();try {t1.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("------主线程获得资源--------");Thread t2 = new Thread(new Task(),"测试线程2");t2.start();try {t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("------主线程获得资源--------");Thread t3 = new Thread(new Task(),"测试线程3");t3.start();try {t3.join();} catch (InterruptedException e) {e.printStackTrace();}}}



运行结果:

测试线程1正在运行-0
测试线程1正在运行-1
测试线程1正在运行-2
测试线程1正在运行-3
测试线程1正在运行-4
测试线程1正在运行-5
测试线程1正在运行-6
测试线程1正在运行-7
测试线程1正在运行-8
测试线程1正在运行-9
测试线程1正在运行-10
测试线程1正在运行-11
测试线程1正在运行-12
测试线程1正在运行-13
测试线程1正在运行-14
测试线程1正在运行-15
测试线程1正在运行-16
测试线程1正在运行-17
测试线程1正在运行-18
测试线程1正在运行-19
测试线程1正在运行-20
测试线程1正在运行-21
测试线程1正在运行-22
测试线程1正在运行-23
测试线程1正在运行-24
测试线程1正在运行-25
测试线程1正在运行-26
测试线程1正在运行-27
测试线程1正在运行-28
测试线程1正在运行-29 //线程1死亡后,主线程获得资源,启动测试线程2

--------主线程获得资源------

测试线程2正在运行-0
测试线程2正在运行-1
测试线程2正在运行-2
测试线程2正在运行-3
测试线程2正在运行-4
测试线程2正在运行-5
测试线程2正在运行-6
测试线程2正在运行-7
测试线程2正在运行-8
测试线程2正在运行-9
测试线程2正在运行-10
测试线程2正在运行-11
测试线程2正在运行-12
测试线程2正在运行-13
测试线程2正在运行-14
测试线程2正在运行-15
测试线程2正在运行-16
测试线程2正在运行-17
测试线程2正在运行-18
测试线程2正在运行-19
测试线程2正在运行-20
测试线程2正在运行-21
测试线程2正在运行-22
测试线程2正在运行-23
测试线程2正在运行-24
测试线程2正在运行-25
测试线程2正在运行-26
测试线程2正在运行-27
测试线程2正在运行-28
测试线程2正在运行-29

--------主线程获得资源------
测试线程3正在运行-0
测试线程3正在运行-1
测试线程3正在运行-2
测试线程3正在运行-3
测试线程3正在运行-4
测试线程3正在运行-5
测试线程3正在运行-6
测试线程3正在运行-7
测试线程3正在运行-8
测试线程3正在运行-9
测试线程3正在运行-10
测试线程3正在运行-11
测试线程3正在运行-12
测试线程3正在运行-13
测试线程3正在运行-14
测试线程3正在运行-15
测试线程3正在运行-16
测试线程3正在运行-17
测试线程3正在运行-18
测试线程3正在运行-19
测试线程3正在运行-20
测试线程3正在运行-21
测试线程3正在运行-22
测试线程3正在运行-23
测试线程3正在运行-24
测试线程3正在运行-25
测试线程3正在运行-26
测试线程3正在运行-27
测试线程3正在运行-28
测试线程3正在运行-29





原创粉丝点击