1. 多線程概念。併發和並行的概念。java
多線程指的是一段時間內cpu同時執行多個線程。一個程序至少運行>=1個進程,進程就是運行中的程序,而一個進程至少運行>=1個線程,線程是操做系統能調度的最小運行單位。一個CPU在同一時刻只能運行一個線程,只是切換比較快速讓人以爲一小段時間內運行了多個線程的錯覺,也就是併發運行。若是要真正達到同一時刻運行多個線程的效果,安裝>=1個CPU就能解決,這個時候就是多個線程並行執行。多線程
2.多線程由誰來調度?誰來劃分優先級?併發
多線程由操做系統來調度,具體是操做系統的線程調度器來調度劃分優先級,即執行的前後順序。spa
3.線程的狀態有幾種?分別是什麼?操作系統
建立狀態----就緒狀態------運行狀態---------阻塞狀態(休眠狀態)--------死亡狀態-------銷燬回收資源線程
4.實現線程間狀態切換的方法:code
new: 用new 實例化繼承thread類的子類或者實現了Runnable接口的子類就建立了一個線程。對象
建立----就緒:調用Thread的start()方法。繼承
就緒---運行:系統準備好資源排列好優先級,到達順序他就會自動執行。接口
運行---就緒:Thread類的靜態方法yield(),當前線程放棄這一次的執行機會回到就緒狀態,和其餘線程競爭下一次運行。
運行---阻塞:Thread的sleep(毫秒)靜態方法讓線程休眠指定時間,Object的wait()方法。
阻塞---運行:sleep(毫秒)到了時間就會甦醒又開始運行。
運行---死亡:不推薦用stop()方法了,在run()方法體設置公用變量來進行是否運行的判斷來決定是否終止。
5.線程如何建立?
寫一個繼承Thread類的子類並重寫它的run()方法,初始化它,調用start()方法就會自動執行run方法體。
實現接口Runnable的子類並實現Runnable的run()方法,經過實例化某個 Thread
實例並將自身做爲運行目標,就能夠運行實現 Runnable
的類而無需建立 Thread
的子類,Thread(Runnable r),Thread(Runnable r,String threadname t).
背景:描述隋朝末年隋朝軍隊和農民起義軍之間的戰爭,主角程咬金幫助農民起義軍發起進攻戰勝了隋朝軍隊,用一個舞臺線程來展示他們的故事,另隋朝軍隊一個線程,農民起義軍一個線程,程咬金一個線程。代碼來源:慕課網某課程老師。
舞臺線程:
package myThread; public class stageThread extends Thread { public void run(){ ArmyThread army=new ArmyThread(); ArmyThread farmer=new ArmyThread(); Thread armyThread=new Thread(army, "隋朝軍隊"); Thread farmerThread=new Thread(farmer,"農民起義軍"); chengHeroThread cheng=new chengHeroThread(); cheng.setName("程咬金"); farmerThread.start(); armyThread.start(); try { Thread.sleep(30);//舞臺線程休眠讓另兩個線程運行完 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } army.stop=true; farmer.stop=true; System.out.println(cheng.getName()+"登場"); cheng.start(); try { cheng.join();//等待該線程終止才結束本線程。 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { System.out.println("舞臺大幕徐徐拉開,精彩好戲將要上映!"); stageThread stage=new stageThread(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } stage.start(); } }
隋朝軍隊和農民起義軍:
public class ArmyThread implements Runnable { public boolean stop=false; public void run() { // TODO Auto-generated method stub while(!stop){ for(int i=1;i<6;i++){ System.out.println(Thread.currentThread().getName()+"進攻對方"+i+"次!"); Thread.yield();//暫停當前正在執行的線程對象,並執行其餘線程。 } } System.out.println(Thread.currentThread().getName()+"中止進攻!"); } }
程咬金:
public class chengHeroThread extends Thread { public void run() { // TODO Auto-generated method stub for(int i=1;i<10;i++) System.out.println("程咬金髮起對隋朝軍隊的攻擊"+i+"次!"); System.out.println("程咬金中止進攻!"); System.out.println("戰爭結束,農民起義軍戰勝隋朝軍隊!"); } }