標籤:
1:線程
1.1:線程是什嗎?線程與進程。
進程:正在啟動並執行程式。windows是多進程的系統。每一個進程有自己的記憶體地區,也就是每個進程都會佔用一定的記憶體。一般開啟應用程式就會有進程的了。
線程:進程的一個分支,一個進程至少包含一個線程。一個進程就叫單線程。
每個線程是共用一個記憶體地區,應該就是共用它所在進程佔用的那塊記憶體吧。如果一個程式同時做多件事件,則需要多線程。結合個人理解和網上的一些解釋說下自己對多線程的理解
1 public class SingleThreadDemo1 { 2 public static void main(String[] args) { 3 int i = 0, j=1; 4 while(i<10){ 5 System.out.print(++i+" "); 6 } 7 add(); 8 max(i, j); 9 }10 public static void add(){11 int i=0, j=0;12 for(i=0; i<10; i++,j-=i){13 System.out.println(i+j);14 }15 }16 public static boolean max(int x, int y){17 if(x>y){18 return true;19 }20 return false;21 }22 }
首先就先看看一段代碼(單線程樣本-1)。雖然程式執行了兩個方法和一個迴圈,但是這些迴圈和方法都是按照順序執行的,最先的當然是程式的入口:main方法了,接下來就是一個迴圈,再接著是add()方法,最後就是max(int x, int y)方法。然而有沒有一種方式可以讓這段代碼中的迴圈、add()、和max(int x, int y),一起(同時)執行,而不用等前面的那個執行完才能執行呢?那麼答案就來了——多線程。我覺得多線程突出的就是“同時”。很多我看的一些書和視頻幾乎都是拿“車站售票”的例子來講,這個挺容易理解。
1.2:Thread類:線程類。
1.2.1:如何建立線程。
1:建立一個類繼承 Thread類,重寫run方法。
class MyThread extends Thread{
public void run(){ }
}
MyThread mt = new MyThread();
mt.start( );//啟動線程。
2:建立一個類實現Runnable介面。重寫run方法。
class MyRunnable implements Runnable{
public void run(){ }
}
MyRunnable mr = new MyRunnable();
Thread t1 = new Thread(mr);
t1.start();
調用start()方法和直接調用run()方法是有很大區別的,調用start()方法是真正的達到了開啟一個線程的目的,而調用run()方法只不過是普通的方法調用而已,不涉及線程的開啟。
3:建立線程的2種方式比較
優先採用實現Runnable介面。因為實現的同時還可以繼承。當多個線程訪問同一個資源的時候,這個時候只能採用實現。如果繼承和實現都可以解決需求,建議優先使用實現。
1.2.2:常用的方法。
1:start():啟動線程
2:getName() :如何獲得當前線程的名字。預設名字為Thread-編號。main方法所在的線程;main
3: currentThread:當前線程的引用。靜態方法。代碼寫在哪個線程內部就可以獲得這個線程的對象。 Thread.currentThread( )
4:設定線程名稱。
4.1:建立線程對象的時候,將線程名稱傳給構造方法
4.2:調用setName方法。設定線程名稱。
5:獲得線程的優先順序 getPriority(),預設優先順序為5.
6:設定優先權。 setPriority( ),優先順序範圍1-10.優先順序高的獲得cpu的執行的機會會更多,但是並不能保證一定可以最先拿到cpu的執行權。
7:睡眠 sleep ( )
8:合并 join( ) , 哪個線程調用此方法,則這個線程先執行完。再執行其他的線程。如果線程A需要線程B的執行結果,這個時候可以線上程 A中,用線程B調用join方法。讓線程B先執行完。線程A再執行。
9:禮讓 yield() 效果不明顯。
10:setDaemon(boolean) :設定當前線程為守護線程或者使用者線程。
預設情況下,線程都是為前台線程,那麼所有的線程執行完,則這個進程就執行完。如果一個進程中有後台線程,當前台線程執行完後,如果後台線程沒有執行完,那麼這個時候後台線程停止執行,進程結束。前台線程執行完後則整個進程就會結束。也就是當進程中只剩下守護線程了沒有執行完,那麼不管守護線程有沒有執行完,它都要停止執行了。
11:控制線程。
1:將線程設定為後台線程,
2:可以用boolean 類型的變數。
12:中斷線程 interrupt( )
13:獲得線程的狀態 getState()
new -----未啟動的線程
Runnable------正在執行的線程
Timed-waitting----正在睡眠的狀態
TERMINATED ---- 已經退出的線程。
BLOCK-----受阻塞的線程。未拿到鎖或者未拿到cpu的線程的.
========================================================================
《Java多線程(二)》
Java多線程(一)初步瞭解