【執行緒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);
}
}
}
並不是說執行緒的優先順序越高越先執行,而是優先順序越高的執行緒執行的機率比較大,也有優先順序較低的執行緒先執行。