第二種方式:編程
Class MyThread implements Runnable{併發
Public void run(){spa
Runnable target=new MyThread();操作系統
Thread t3=new Thread(target);線程
Thread.start();//啓動線程繼承
}接口
}隊列
P384:經過接口實現繼承進程
練習:寫兩個線程:ci
① 輸入200個「###」②輸入200個「***」
下面爲線程中的7中很是重要的狀態:(有的書上也只有認爲前五種狀態:而將「鎖池」和「等待隊列」都當作是「阻塞」狀態的特殊狀況:這種認識也是正確的,可是將「鎖池」和「等待隊列」單獨分離出來有利於對程序的理解)
① ⑴
② ⑵
③ ⑶ run()結束
Start()
OS分配CPU
CPU時間片結束
yield() o.wait()
等待鎖標記
notify()
注意:圖中標記依次爲
①輸入完畢;②wake up③t1退出
⑴如等待輸入(輸入設備進行處理,而CUP不處理),則放入阻塞,直到輸入完畢。
⑵線程休眠sleep()
⑶t1.join()指中止main(),而後在某段時間內將t1加入運行隊列,直到t1退出,main()才結束。
特別注意:①②③與⑴⑵⑶是一一對應的。
進程的休眠:Thread sleep(1000);//括號中以毫秒爲單位
當main()運行完畢,即便在結束時時間片尚未用完,CPU也放棄此時間片,繼續運行其餘程序。
Try{Thread.sleep(1000);}
Catch(Exception e){e.printStackTrace(e);}
T1.join()表示運行線程放棄執行權,進入阻塞狀態。
當t1結束時,main()能夠從新進入運行狀態。
T1.join其實是把併發的線程編程並行運行。
線程的優先級:1-10,越大優先級越高,優先級越高被OS選中的可能性就越大。(不建議使用,由於不一樣操做系統的優先級並不相同,使得程序不具有跨平臺性,這種優先級只是粗略地劃分)。
注:程序的跨平臺性:除了可以運行,還必須保證運行的結果。
一個使用yield()就立刻交出執行權,回到可運行狀態,等待OS的再次調用。