1. 程式人生 > >【執行緒2】Thread的方法

【執行緒2】Thread的方法

Thread的常用方法

(1).start():啟動執行緒並執行相應的run()方法

(2).run():子執行緒要執行的程式碼放入run()方法中

(3).currentThread():靜態的,調取當前的執行緒

(4).getName():獲取此執行緒的名字

(5)setName():設定此執行緒的名字

//1.建立一個繼承Thread類的子類
class SubThread extends Thread{
	//2.重寫Thread類的run()方法,方法內實現此子執行緒要完成的功能
	public void run(){
		for(int i=0;i<=100;i++){
			//調取當前執行緒,並獲取執行緒的名字
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}
public class TestThread extends Thread {
public static void main(String[] args) {
	//3.建立一個子類的物件
	SubThread st=new SubThread();
	//設定執行緒st的名字
	st.setName("子執行緒1");
	//4.呼叫執行緒的start()方法:啟動此執行緒;呼叫相應的run()方法
	st.start();
	//設定當前執行緒的名字
	Thread.currentThread().setName("=====主執行緒");
	for(int i=0;i<=100;i++){
		System.out.println(Thread.currentThread().getName()+":"+i);
	}
}
}

執行結果:

(6).yield():呼叫此方法的執行緒釋放當前CPU的執行權,釋放CPU的執行權後有可能當前執行緒再次搶到執行權,正常現象

//1.建立一個繼承Thread類的子類
class SubThread extends Thread{
	//2.重寫Thread類的run()方法,方法內實現此子執行緒要完成的功能
	public void run(){
		for(int i=0;i<=100;i++){
			//調取當前執行緒,並獲取執行緒的名字
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}
public class TestThread extends Thread {
public static void main(String[] args) {
	//3.建立一個子類的物件
	SubThread st=new SubThread();
	//設定執行緒st的名字
	st.setName("子執行緒1");
	//4.呼叫執行緒的start()方法:啟動此執行緒;呼叫相應的run()方法
	st.start();
	//設定當前執行緒的名字
	Thread.currentThread().setName("=====主執行緒");
	for(int i=0;i<=100;i++){
		System.out.println(Thread.currentThread().getName()+":"+i);
		if(i%10==0){
//當前執行緒釋放CPU的執行權
			Thread.currentThread().yield();
		}
	}
}
}

執行結果:

(7).join():在A執行緒中呼叫B執行緒的join()方法,表示:當執行到此方法時,A執行緒停止執行,直至B執行緒執行完畢,A執行緒再接著join()之後的程式碼執行。

//子執行緒
//1.建立一個繼承Thread類的子類
class SubThread extends Thread{
	//2.重寫Thread類的run()方法,方法內實現此子執行緒要完成的功能
	public void run(){
		for(int i=0;i<=100;i++){
			//調取當前執行緒,並獲取執行緒的名字
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}
//主執行緒
public class TestThread extends Thread {
public static void main(String[] args) {
	//3.建立一個子類的物件
	SubThread st=new SubThread();
	//設定執行緒st的名字
	st.setName("子執行緒1");
	//4.呼叫執行緒的start()方法:啟動此執行緒;呼叫相應的run()方法
	st.start();
	//設定當前執行緒的名字
	Thread.currentThread().setName("=====主執行緒");
	for(int i=0;i<=100;i++){
		System.out.println(Thread.currentThread().getName()+":"+i);
		//在主執行緒中執行子執行緒的join()方法,當主執行緒的i=20時·,執行子執行緒,子線全部執行完畢執行主執行緒
		if(i==20){
			try {
				st.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
}

執行結果:

(8).isAlive():判斷當前執行緒是否還存活,返回一個布林型別的值。存活返回true,不存活返回false。

//1.建立一個繼承Thread類的子類
class SubThread extends Thread{
	//2.重寫Thread類的run()方法,方法內實現此子執行緒要完成的功能
	public void run(){
		for(int i=0;i<=100;i++){
			//調取當前執行緒,並獲取執行緒的名字
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}
//主執行緒
public class TestThread extends Thread {
public static void main(String[] args) {
	//3.建立一個子類的物件
	SubThread st=new SubThread();
	//設定執行緒st的名字
	st.setName("子執行緒1");
	//4.呼叫執行緒的start()方法:啟動此執行緒;呼叫相應的run()方法
	st.start();
	//設定當前執行緒的名字
	Thread.currentThread().setName("=====主執行緒");
	for(int i=0;i<=100;i++){
		System.out.println(Thread.currentThread().getName()+":"+i);
		//在主執行緒中執行子執行緒的join()方法,當主執行緒的i=20時·,執行子執行緒
		//子線全部執行完畢執行主執行緒
		if(i==20){
			try {
				st.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	//判斷子執行緒st是否還存活
	System.out.println(st.isAlive());
}
}

9執行結果:

(9).sleep(long l):顯式的讓當前執行緒睡眠l毫秒

(10)執行緒的排程

排程策略:

1.時間片:讓所有的執行緒輪流獲得cpu的使用權,並且平均分配每個執行緒佔用的CPU的時間片

2.搶佔式:高優先級別的執行緒搶佔CPU

java虛擬機器採用搶佔式排程模型,是指優先讓可執行池中優先順序高的執行緒佔用CPU,如果可執行池中的執行緒優先順序相同,那麼就隨機選擇一個執行緒,使其佔用CPU。處於執行狀態的執行緒會一直執行,直至它不得不放棄CPU。

程序的優先順序

程序的優先順序一共有十個級別,10是最高級別,1是最低級別

其中:MAX_PRIORITY(10):最高優先順序

          MIN_PRIORITY(1):最低優先順序

          NORM_PRIORITY(5):普通優先順序,一般預設優先順序為5

涉及的方法:

getPriority:返回執行緒的優先值

setPriority(int newPriority):改變執行緒的優先順序

執行緒建立是可繼承父執行緒的優先值

//1.建立一個繼承Thread類的子類
class SubThread extends Thread{
	//2.重寫Thread類的run()方法,方法內實現此子執行緒要完成的功能
	public void run(){
		for(int i=0;i<=100;i++){
			//調取當前執行緒,並獲取執行緒的名字,獲取當前執行緒的優先值
			System.out.println(Thread.currentThread().getName()+":"
			+Thread.currentThread().getPriority()+":"+i);
		}
	}
}
//主執行緒
public class TestThread extends Thread {
public static void main(String[] args) {
	//3.建立一個子類的物件
	SubThread st=new SubThread();
	//設定執行緒st的名字
	st.setName("子執行緒1");
	//設定執行緒的優先順序
	st.setPriority(MAX_PRIORITY);
	//4.呼叫執行緒的start()方法:啟動此執行緒;呼叫相應的run()方法
	st.start();
	//設定當前執行緒的名字
	Thread.currentThread().setName("=====主執行緒");
	for(int i=0;i<=100;i++){
		System.out.println(Thread.currentThread().getName()+":"
				+Thread.currentThread().getPriority()+":"+i);
		
	}
	
}
}

並不是說執行緒的優先順序越高越先執行,而是優先順序越高的執行緒執行的機率比較大,也有優先順序較低的執行緒先執行。