runable實現資料共享
阿新 • • 發佈:2018-11-04
第一課:認識下多執行緒
/** * 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 中等優先順序
}