1. 程式人生 > >執行緒中簡單的方法

執行緒中簡單的方法

start()和run()

Start()方法:使執行緒開始執行,java虛擬機器中呼叫該執行緒的run()方法。

run()方法:如果該執行緒是使用獨立的Runnable()執行物件構造的,則執行Runnable物件的run方法;否則什麼都不執行,值得一提的是,一般我們繼承的Thread類已經實現了Runnable介面。

 執行的結果

main...執行...
Thread-0...執行...

可以發現start才是啟動了一個執行緒,而run只是呼叫了類中的方法。

getName和setName方法

getName方法獲取當前執行緒的名字

setName方法設定當前執行緒的名字

 執行結果是:

t1
t1...執行...

 值得注意的是,run方法中不能直接呼叫getName方法

join和yield方法

join方法時暫停當前執行緒,呼叫其他執行緒,如果帶引數的,則暫停引數所給值得時間,之後繼續執行。

class DemoThread extends Thread{
	public void run(){
		for(int i = 0; i<10;i++){
			System.out.println(Thread.currentThread().getName()+"-"+i+"...執行...");
		}
	}
}
public class demo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DemoThread demoThread = new DemoThread();
		demoThread.setName("t1");
		demoThread.start();
		for(int j =0;j<10;j++){
			if(j == 1){
				try {
					demoThread.join();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(Thread.currentThread().getName()+"-"+j+"...執行...");
		}
		
	}

}

執行結果 

main-0...執行...
t1-0...執行...
t1-1...執行...
t1-2...執行...
t1-3...執行...
t1-4...執行...
t1-5...執行...
t1-6...執行...
t1-7...執行...
t1-8...執行...
t1-9...執行...
main-1...執行...
main-2...執行...
main-3...執行...
main-4...執行...
main-5...執行...
main-6...執行...
main-7...執行...
main-8...執行...
main-9...執行...

yield方法是使當前執行緒釋放cpu從執行狀態轉為就緒狀態,從剩餘執行緒的優先順序高的選取執行,但是如果只有當前一個執行緒的話,當先執行緒又會獲得cpu的執行許可權。

class DemoThread extends Thread{
	public void run(){
		for(int i = 0; i<10;i++){
			System.out.println(Thread.currentThread().getName()+"-"+i+"...執行...");
			if(i==4){
				Thread.yield();
			}
		}
		
	}
}
public class demo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DemoThread demoThread = new DemoThread();
		demoThread.setName("t1");
		
		DemoThread demoThread2 = new DemoThread();
		demoThread2.setName("t2");
		
		demoThread.start();
		demoThread2.start();
	}

}

執行結果

t1-0...執行...
t1-1...執行...
t1-2...執行...
t1-3...執行...
t2-0...執行...
t1-4...執行...
t2-1...執行...
t1-5...執行...
t1-6...執行...
t1-7...執行...
t2-2...執行...
t1-8...執行...
t1-9...執行...
t2-3...執行...
t2-4...執行...
t2-5...執行...
t2-6...執行...
t2-7...執行...
t2-8...執行...
t2-9...執行...

yield方法不會釋放同步鎖 我們試著加上同步鎖

class DemoThread extends Thread{
	private static Object obj = new Object();
	
	public  void run(){
		
		synchronized(obj){
			for(int i = 0; i<10;i++){
				System.out.println(Thread.currentThread().getName()+"-"+i+"...執行...");
				if(i==4){
					Thread.currentThread().yield();
				}
			}
		}
		
		
	}
}
public class demo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DemoThread demoThread = new DemoThread();
		demoThread.setName("t1");
		
		DemoThread demoThread2 = new DemoThread();
		demoThread2.setName("t2");
		
		demoThread.start();
		demoThread2.start();
	}

}

執行結果

t1-0...執行...
t1-1...執行...
t1-2...執行...
t1-3...執行...
t1-4...執行...
t1-5...執行...
t1-6...執行...
t1-7...執行...
t1-8...執行...
t1-9...執行...
t2-0...執行...
t2-1...執行...
t2-2...執行...
t2-3...執行...
t2-4...執行...
t2-5...執行...
t2-6...執行...
t2-7...執行...
t2-8...執行...
t2-9...執行...