线程的联合join()
线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继续执行。
下面使用一个Demo来讲解join()方法的使用
节奏:“本宝宝”想喝一冷泡茶饮品,于是联合了:“劳工贝贝(劳工贝贝:本宝宝的好兄弟)”去给本宝宝买,(嘻嘻,本宝宝我就是懒的呢),“本宝宝线程”必须等待“劳工贝贝线程”买饮品回来,“本宝宝”才能喝到。
本Demo代码如下所示:
package com.shenqi.jointhread; public class TestThreadJoin { public static void main(String[] args) { System.out.println("劳工贝贝给可爱的本宝宝买饮品的故事"); Thread baby = new Thread(new StoryThread()); baby.start(); } } class StoryThread implements Runnable{ @Override public void run() { System.out.println("本宝宝突然想喝冷泡茶饮品,"); System.out.println("就让我劳工贝贝去给本宝宝买啦"); Thread bebe = new Thread(new BebeThread()); bebe.start(); System.out.println("本宝宝在家等着我劳工贝贝买回家"); try { bebe.join(); } catch (InterruptedException e) { e.printStackTrace(); System.out.println("半天没有见我劳工贝贝归来,我赶紧出门去寻找"); //结束JVM(Java虚拟机)。如果是0则表示程序正常结束,非0则表示程序非正常结束 System.exit(1); } System.out.println("我劳工贝贝为我很辛苦的呢,你先喝一口啦。"); } } class BebeThread implements Runnable{ @Override public void run() { System.out.println("劳工贝贝去超市买本宝宝想喝的饮品"); System.out.println("路途有点远,但是我劳工贝贝还是要去(需10分钟)"); for (int i = 0; i <= 10; i++) { System.out.println("当前是第" + i + "分钟"); try { //我劳工贝贝跑的快,但是我想让他慢一点呢,我不想他那么累。 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("我劳工贝贝买饮品归来"); } }程序运行结果如下所示:
劳工贝贝给可爱的本宝宝买饮品的故事 本宝宝突然想喝冷泡茶饮品, 就让我劳工贝贝去给本宝宝买啦 本宝宝在家等着我劳工贝贝买回家 劳工贝贝去超市买本宝宝想喝的饮品 路途有点远,但是我劳工贝贝还是要去(需10分钟) 当前是第0分钟 当前是第1分钟 当前是第2分钟 当前是第3分钟 当前是第4分钟 当前是第5分钟 当前是第6分钟 当前是第7分钟 当前是第8分钟 当前是第9分钟 当前是第10分钟 我劳工贝贝买饮品归来 我劳工贝贝为我很辛苦的呢,你先喝一口啦。
线程的常用方法
方法 | 功能 |
---|---|
isAlive() | 判断线程是否还“活”着,即线程是否还未终止 |
getPriority() | 获得线程的优先级数量 |
setPriority() | 设置线程的优先级数值 |
setName() | 给线程一个名字 |
getName() | 取得线程的名字 |
currentThread() | 取得当前正在运行的线程对象,也就是取得自己本身 |
下面来个两个小Demo使用一下这些方法。
小Demo(1)代码如下所示:
package com.shenqi.normal; public class TestThread { public static void main(String[] args) throws Exception { System.out.println("***********小Demo(1)***********"); Runnable runnable = new MyThread(); //定义线程对象,并传入参数 Thread thread = new Thread(runnable, "我的线程"); //启动线程 thread.start(); //输出线程名称 System.out.println("线程名称:" + thread.getName()); //线程暂停5分钟 Thread.currentThread().sleep(5000); //判断线程还在运行吗? System.out.println("线程的当前状态:" + thread.isAlive()); System.out.println("线程名称:" + thread.getName() + " 执行完毕"); System.out.println("当前线程的优先级为:" + thread.getPriority()); } } class MyThread implements Runnable{ @Override public void run() { //线程体 for (int i = 0; i < 10; i++) { System.out.println("线程体:" + i); } } }执行结果如下所示:
***********小Demo(1)*********** 线程名称:我的线程 线程体:0 线程体:1 线程体:2 线程体:3 线程体:4 线程体:5 线程体:6 线程体:7 线程体:8 线程体:9 线程的当前状态:false 线程名称:我的线程 执行完毕 当前线程的优先级为:5
- 处于就绪状态的线程,会进入“就绪队列”等待JVM(Java虚拟机)来挑选。
- 线程的优先级用数字表示,范围从1到10,一个线程的默认优先级是5。
- 使用下列方法获得或设置线程对象的优先级。
- int getPriority();
- void setPriority(int new Priority);
注意:优先级低只是意味着获得调度的概率低。并不是绝对先调用优先级高的线程后调用优先级低的线程。
小Demo(2)代码如下所示:
package com.shenqi.normal; public class TestThreadTwo { public static void main(String[] args) { System.out.println("***********小Demo(2)***********"); Thread thread1 = new Thread(new MyThreadTwo(), "我的线程One"); Thread thread2 = new Thread(new MyThreadTwo(), "我的线程Two"); thread1.setPriority(1); thread2.setPriority(10); thread1.start(); thread2.start(); } } class MyThreadTwo extends Thread{ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } }执行结果如下所示:
***********小Demo(2)*********** 我的线程One:0 我的线程One:1 我的线程One:2 我的线程One:3 我的线程One:4 我的线程One:5 我的线程One:6 我的线程Two:0 我的线程One:7 我的线程One:8 我的线程One:9 我的线程Two:1 我的线程Two:2 我的线程Two:3 我的线程Two:4 我的线程Two:5 我的线程Two:6 我的线程Two:7 我的线程Two:8 我的线程Two:9