1. 程式人生 > >對於多執行緒的一些理解

對於多執行緒的一些理解

實現多執行緒的兩種方法:

繼承Thread類

實現Runnable介面

(JDK1.5之後提供了一個心得Callable介面)

在啟動多執行緒的時候必須通過start()方法,而不能直接呼叫run()方法

原因:先來看下start()方法在Thread類中的定義:

	public synchronized void start(){
		if(threadStatus!=0)
			throw new IllegalThreadStateException();
		...
		start0();
		...
	}
	private native void start0();

start()方法呼叫時會丟擲“IllegalThreadStateException”異常,一般在重複呼叫的時候會丟擲,而實際上正真呼叫的是start()方法。此方法在宣告時使用了native關鍵字宣告,表示呼叫本機的作業系統函式。因為多執行緒需要依靠底層作業系統的支援。

一個類如果只能繼承Thread類才能實現多執行緒,則肯定會受到單繼承的侷限,所以一般來說,要實現多執行緒,可以通過實現Runnable介面完成;

實現Runnable介面可以資源共享

package thread;
/**
 * 實現Runnable介面可以資源共享
 *
 */
public class BaseThread implements Runnable{
	private int ticket = 5;
	
	@Override
	public void run() {
		for(int i=0;i<20;i++){
			if(ticket>0){
				System.out.println("賣票:ticket = "+ticket--);
			}
		}
	}
	public static void main(String[] args) {
		BaseThread my = new BaseThread();
		//啟動3個執行緒
		new Thread(my).start();
		new Thread(my).start();
		new Thread(my).start();
	}

}

結果:

賣票:ticket = 5
賣票:ticket = 3
賣票:ticket = 4
賣票:ticket = 1
賣票:ticket = 2

 執行緒的休眠   執行緒的中斷

package thread;
/**
 * 執行緒的休眠
 * 執行緒的中斷
 *
 */
public class InterruptThread implements Runnable{
	
	@Override
	public void run() {
		System.out.println("1.進入run方法!");
		
		try {
			Thread.sleep(10000);
			System.out.println("2.已完成休眠!");
		} catch (InterruptedException e) {
			System.out.println("3.休眠被終止!");
			return;
		}
		System.out.println("4.run方法正常結束!");
	}
	public static void main(String[] args) {
		InterruptThread my = new InterruptThread();
		Thread t =new Thread(my);
		t.start();
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
			}
		t.interrupt();
		}
}

執行緒的強制執行 

package thread;
/**
 * 執行緒的強制執行
 *
 */
public class JoinThread implements Runnable{
	
	@Override
	public void run() {
		for(int i=0;i<10;i++){
				System.out.println(Thread.currentThread().getName()+"執行 -->" +i);
		}
	}
	public static void main(String[] args) {
		JoinThread my = new JoinThread();
		//啟動3個執行緒
		Thread t =new Thread(my);
		t.start();
	
		for (int i = 0; i < 10; i++) {
			if(i>5){
				try {
					t.join();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(Thread.currentThread().getName()+"執行main -->" +i);
		}
	}
}

執行緒禮讓 

package thread;
/**
 * 執行緒禮讓
 *
 */
public class YieldThread implements Runnable{

	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println(Thread.currentThread().getName()+"執行:--->"+i);
			if (i==3) {
				System.out.println("執行緒禮讓:");
				Thread.currentThread().yield();
			}
		}
	}
	
	public static void main(String[] args) {
		YieldThread my = new YieldThread();
		Thread t1 =new Thread(my,"執行緒1");
		Thread t2 =new Thread(my,"執行緒2");
		t1.start();
		t2.start();
	}

}