Java线程优先级及线程的联合join()
线程的联合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