1. 程式人生 > >runable實現資料共享

runable實現資料共享

第一課:認識下多執行緒

/**
* thread子類(並不是說Thread不能實現共享,因為Thread實現了runable介面,同樣可以new Thread("繼承Thread類的操作類").start(也可以實現共享))
*/

public class MyThread extends Thread{
	
	private int ticket = 12;

	@Override
	public  void run() {
		int num = 1;
		for (int i = 1; i <= 100; i++) {//for迴圈幾次看做幾個人買票(一張)
			if(ticket>0){
			System.out.println(Thread.currentThread().getName() + "剩餘票數量為:"+--ticket+"執行了"+ ( num ++ ) +"次");
			}
		}
	}
	
	//一個類就是一個任務(售票),這個任務去派給n個人也就是n個視窗(執行緒)去執行,但這裡演示的是各自執行緒去執行同一個任務,但資料卻沒有共享,這明顯是不符合要求的
	public static void main(String[] args) {
		try {
			MyThread thA = new MyThread();
			MyThread thB = new MyThread();
			MyThread thC = new MyThread();
			thA.start();
			thB.start();
			thC.start();
			//thA.start();  throw new Exception("不能多次啟用同一個執行緒")
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}



/**
* runnable子類(避免單繼承的尷尬)
*/
public class threadImplRunable implements Runnable{
	
	private int ticket = 12;

	@Override
	public  void run() {
		int num = 1;
		for (int i = 1; i <= 100; i++) {//for迴圈幾次看做幾個人買票(一張)
			if(ticket>0){
			System.out.println(Thread.currentThread().getName() + "剩餘票數量為:"+--ticket+"執行了"+ ( num ++ ) +"次");
			}
		}
	}
	
	
	//一個類就是一個任務(售票),這個任務去派給n個人也就是n個視窗(執行緒)去執行,但這裡演示的是各自執行緒去執行同一個任務,但資料卻沒有共享,這明顯是不符合要求的
/**同時啟動了3個執行緒物件,但與Thread操作不同的是,這三個執行緒都佔用有個runnable介面物件的引用,所以實現了資料共享**/
	public static void main(String[] args) {
		try {
			threadImplRunable thA = new threadImplRunable ();
			new Thread(thA).start();
			new Thread(thA).start();
			new Thread(thA).start();
			//thA.start();不能多次啟用同一個執行緒
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

第二課:執行緒的操作狀態

1、建立-

2、就緒(建立新的執行緒物件後,呼叫start()方法就進入了就緒狀態,進入執行緒佇列排隊,等待cpu呼叫分配)

3、執行(當就緒執行緒被呼叫並獲得處理器資源是,就進入了執行狀態,此時自動呼叫執行緒物件的run方法,也就是該執行緒的操作和功能)

4、堵塞(一個執行緒在某些特定情況下,如被人掛起或者需要耗時的輸入輸出操作時就會被讓出cpu並終止自己的的執行,進入堵塞狀態。比如呼叫了sleep,suspend,wait等就會處於堵塞狀態,此時不能排入佇列,只有當堵塞原因消除才能進入就緒狀態)

5、終止狀態(執行緒呼叫stop方法或run方法執行完成後就處於終止狀態,處於其狀態就不再具備繼續執行的能力)

第三課:執行緒的優先順序(public static final int ...)

MAX_PRIORITY------最高優先順序

NORM_PRIORITY-----中等優先順序

MIN_PRIORITY-------最低優先順序

常用方法有三個:

public static final int MIN_PRIORITY()    最低優先順序 1

publci void setPriority(int newPriority)     設定執行緒優先順序(vip)

public final int getPriority();    獲取執行緒優先順序

舉個例子:

public class MyThread implements Runnable{
	static int num = 0;
	@Override
	public void run() {
	for (int i = 0; i < 10; i++) {
/*		try {
			Thread.sleep(1000);//加不加都一樣,都是先列印C
		} catch (InterruptedException e) {
			e.printStackTrace();
		}*/
		System.out.println(Thread.currentThread().getName()+",迴圈的次數"+i);
	}

		
	}
	
	public static void main(String[] args) {
		MyThread mt = new MyThread();
		new Thread(mt,"執行緒A").start();//執行緒一啟動
		new Thread(mt,"執行緒B").start();//執行緒二啟動
		Thread th = new Thread(mt,"執行緒C");
		th.setPriority(Thread.MAX_PRIORITY);//設定為最高優先順序
		th.start();//執行緒三啟動
	}
	
}
執行緒C,迴圈的次數0
執行緒C,迴圈的次數1
執行緒C,迴圈的次數2
執行緒C,迴圈的次數3
執行緒C,迴圈的次數4
執行緒C,迴圈的次數5
執行緒C,迴圈的次數6
執行緒C,迴圈的次數7
執行緒C,迴圈的次數8
執行緒C,迴圈的次數9
執行緒A,迴圈的次數0
執行緒A,迴圈的次數1
執行緒A,迴圈的次數2
執行緒A,迴圈的次數3
執行緒B,迴圈的次數0
執行緒B,迴圈的次數1
執行緒B,迴圈的次數2
執行緒B,迴圈的次數3
執行緒B,迴圈的次數4
執行緒B,迴圈的次數5
執行緒B,迴圈的次數6
執行緒A,迴圈的次數4
執行緒B,迴圈的次數7
執行緒A,迴圈的次數5
執行緒A,迴圈的次數6
執行緒B,迴圈的次數8
執行緒A,迴圈的次數7
執行緒A,迴圈的次數8
執行緒B,迴圈的次數9
執行緒A,迴圈的次數9

//這裡列印並不一定是C先開始,後續可在做研究????
拋轉引玉:main方法也是個多執行緒,那麼它的優先順序又是多少呢?
public staitc void main(String[] args) throws Exception(){
    System.out.println(Thread.currentThread().getPriority());//5  中等優先順序
}