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