多線程的建立方式一
1、建立一個繼承於Thread類的子類
2、重寫Thread類的run()
將此線程執行的操做聲明在run()中
3、建立Thread類的子類的對象
4. 經過此對象調用start()
java
run()
run()
的方式啓動線程。(直接調用,則是在mian()
主線程運行的)public class ThreadDemo { public static void main(String[] args) { //③建立Thread類的子類的對象 MyThread1 m1 = new MyThread1(); MyThread2 m2 = new MyThread2(); //方法一:④經過此對象調用start() m1.start(); m2.start(); //方法二:④建立Thread類的匿名子類的方式 new Thread() { @Override public void run() { for (int i = 0; i < 100; i++) {a if (i % 2 == 0) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } }.start(); new Thread() { @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 != 0 ) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } }.start(); } } //①建立一個繼承於Thread類的子類 class MyThread1 extends Thread { //②重寫Thread類的run() 將此線程執行的操做聲明在run()中 @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 == 0 ) { System.out.println(Thread.currentThread().getName() + ":" +i); } } } } //①建立一個繼承於Thread類的子類 class MyThread2 extends Thread { //②重寫Thread類的run() 將此線程執行的操做聲明在run()中 @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 != 0 ) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } }
start()
:啓動當前線程,調用當前線程的run()
方法。
run()
:一般須要重寫Thread
類中的此方法,將建立的線程要執行的操做聲明在此方法中。
currentThread()
:靜態方法,返回當前代碼的線程。
getName()
:獲取當前線程的名字。
setName()
:設置當前線程的名字。
yield()
:釋放當前CPU的執行。
join()
:在線程A中調用線程B的join()
,此時線程A就進入阻塞狀態,直到線程B徹底執行完以後,線程A才結束阻塞狀態。
stop()
:當執行此方法時,強制結束當前線程。(已過期)
sleep()
:讓當前線程「睡眠」指定的millitime
毫秒,在指定的millitime
毫秒時間內,當前線程是阻塞狀態。
isAlive()
:判斷當前線程是否存活。多線程
NORM_PRIORITY = 5;
(默認線程級)
MIN_PRIORITY = 1;
MAX_PRIORITY = 10;
ide
如何獲取和設置當前線程的優先級
getPriority()
:獲取當前線程的優先級。
setPriority(int p)
:設置當前線程的優先級。測試
高優先級的線程要搶佔低優先級線程CPU的執行權,可是隻是從機率上講,高優先級的線程高几率的狀況下被執行。並不意味着只有當高優先級的線程執行完之後,纔去執行低優先級。線程
① 建立一個實現了Runnable
接口的類。
② 實現類去實現Runnable
中的抽象方法:run()
。
③ 建立實現類的對象。
④ 將此對象做爲參數傳遞到Thread
類的構造器中,建立Thread
類的對象。
⑤ 經過Thread
類的對象調用start()
:
第一步:啓動線程。
第二步:調用當前線程的run()
→調用了Runnable
類型的target
的run()
。code
//① 建立一個實現了`Runnable`接口的類 class RThread implements Runnable { //② 實現類去實現`Runnable`中的抽象方法:`run()` @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + ":" +i); } } } public class ThreadTest1 { public static void main(String[] args) { //③ 建立實現類的對象 RThread rThread = new RThread(); //④ 將此對象做爲參數傳遞到Thread類的構造器中,建立Thread類的對象 Thread thread1 = new Thread(rThread); thread1.setName("線程一"); //⑤ 經過Thread類的對象調用start() thread1.start(); //再啓動一個線程,遍歷100之內的偶數 Thread thread2 = new Thread(rThread); thread2.setName("線程二"); thread2.start(); } }
開發中:優先選擇,實現Runnable
接口的方式。
緣由:
1.繼承的方式有單繼承的侷限性,而實現的方法沒有類的單繼承的侷限性。
2.實現的方法更適合來處理多個線程有共享數據的狀況。對象
相同點:兩中方式都須要重寫run()
,將線程要執行的邏輯聲明在run()
中。
聯繫:public class Thread implements Runnable{}
,Thread
也是實現Runnable
接口,也重寫了run()
方法。繼承