線程調度 兩種調度方式 ? 分時調度模型:所有線程輪流使用 CPU 的使用權,平均分配每個線程占用 CPU 的時間片 ? 搶占式調度模型:優先讓優先級高的線程使用 CPU,如果線程的優先級相同,那么會隨機選擇一個,優先級高的線程獲取的 CPU 時間片相對多一些 Java使用的是搶占式調度模型 隨機性 假如計算機只有一個 CPU,那么 CPU 在某一個時刻只能執行一條指令,線程只有得到CPU時間片,也就是使用權,才可以執行指令。所以說多線程程序的執行是有隨機性,因為誰搶到CPU的使用權是不一定的優先級相關方法
方法名說明
final int getPriority()
返回此線程的優先級
final void setPriority(int newPriority)
更改此線程的優先級 線程默認優先級是5;線程優先級的范圍是:1-10
publicclassThreadPriorityextendsThread{@Overridepublicvoidrun(){for(int i =0;i<100;i++){System.out.println(getName()+":"+i);}}}publicclasstest3{publicstaticvoidmain(String[] args){ThreadPriority tp1 =newThreadPriority();ThreadPriority tp2 =newThreadPriority();ThreadPriority tp3 =newThreadPriority();tp1.setName("高鐵");tp2.setName("飛機");tp3.setName("汽車");//public final int getPriority():返回此線程的優先級System.out.println(tp1.getPriority());// 5System.out.println(tp2.getPriority());// 5System.out.println(tp3.getPriority());//5//public final void setPriority(int newPriority):更改此線程的優先級// tp1.setPriority(10000); //IllegalArgumentExceptionSystem.out.println(Thread.MAX_PRIORITY);//10System.out.println(Thread.MIN_PRIORITY);//1System.out.println(Thread.NORM_PRIORITY);//5//設置正確的優先級tp1.setPriority(5);tp2.setPriority(10);tp3.setPriority(1);tp1.start();tp2.start();tp3.start();}}
1.5線程控制
相關方法
方法名說明
static void sleep(long millis)
使當前正在執行的線程停留(暫停執行)指定的毫秒數
void join()
等待這個線程死亡
void setDaemon(boolean on)
將此線程標記為守護線程,當運行的線程都是守護線程時,Java虛擬機將退出
代碼演示
//sleep演示publicclassThreadSleepextendsThread{@Overridepublicvoidrun(){for(int i =0; i <100; i++){System.out.println(getName()+":"+ i);try{Thread.sleep(1000);}catch(InterruptedException e){e.printStackTrace();}}}}//測試類publicclasstest4{publicstaticvoidmain(String[] args){ThreadSleep ts1 =newThreadSleep();ThreadSleep ts2 =newThreadSleep();ThreadSleep ts3 =newThreadSleep();ts1.setName("曹操");ts2.setName("劉備");ts3.setName("孫權");ts1.start();ts2.start();ts3.start();}}//Join演示:publicclassThreadJoinextendsThread{@Overridepublicvoidrun(){for(int i =0; i <100; i++){System.out.println(getName()+":"+ i);}}}publicclasstest5{publicstaticvoidmain(String[] args){ThreadJoin tj1 =newThreadJoin();ThreadJoin tj2 =newThreadJoin();ThreadJoin tj3 =newThreadJoin();tj1.setName("康熙");tj2.setName("四阿哥");tj3.setName("六阿哥");tj1.start();try{tj1.join();}catch(InterruptedException e){e.printStackTrace();}tj2.start();tj3.start();}}//Daemon演示:publicclassThreadDaemonextendsThread{@Overridepublicvoidrun(){for(int i =0; i <100; i++){System.out.println(getName()+":"+ i);}}}publicclasstest6{publicstaticvoidmain(String[] args){ThreadDaemon td1 =newThreadDaemon();ThreadDaemon td2 =newThreadDaemon();td1.setName("張飛");td2.setName("關羽");//設置主線程為劉備Thread.currentThread().setName("劉備");//設置守護線程td1.setDaemon(true);td2.setDaemon(true);td1.start();td2.start();for(int i =0; i <10; i++){System.out.println(Thread.currentThread().getName()+":"+ i);}}}