Java:多執行緒基礎
阿新 • • 發佈:2018-11-26
Java中的多執行緒
程序:一個程式的執行
執行緒:程式中某個順序的流程控制,通俗來講,就是不同的任務
一個程序可以有多個執行緒
執行緒的分類
- 普通執行緒(非Daemon執行緒)
在Java中,如果還有非Daemon執行緒,整個程式就不會結束 - Daemon執行緒(守護執行緒,後臺執行緒)
如果不存在Daemon執行緒,則後臺執行緒自動終止
ps:辣雞回收執行緒是後臺執行緒
執行緒的建立
- 方法一 通繼承Thread類來建立執行緒
class ThreadPractice extends Thread{
@Override
public void run(){
......
......
};
}
//匿名內部類
Thread td = new Thread(){
@Override
public void run{
method(something);
}
private void method(型別 變數名){
.......
}
};
- 方法二 通過向Thread()構造方法傳遞Runnable物件來建立執行緒
class ThreadPractice implements Runnable {
public void run(){};
}
執行緒的控制
啟動
start();暫停
try{
Thread.sleep(ms);
}catch(InterruptedException e){ }結束
- Daemon執行緒在無非Daemon執行緒時自動結束
- run執行完自動結束
- 線上程的while(true)迴圈中使用標記變數退出
執行緒安全
同時執行的執行緒需要共享資料,那麼則需要考慮執行緒安全,考慮執行緒安全即是實現同步
如 兩個執行緒都對一項資料進行操作,執行緒A取出該資料進行運算後還未更新該資料,而執行緒B又取出該資料一次,則某個執行緒的操作就被忽略了 要避免這一狀況,就需要考慮執行緒安全
//執行緒不安全示例
public class ThreadSafe {
private static int cnt;
public static void main(String[] args) {
final int NUM=500;
Thread [] threads = new Thread[NUM];
for (int i=0;i<NUM;i++){
threads[i] = new Thread(){
@Override
public void run() {
int i = 0;
while(i++<1000)
cnt++;
}
};
}
for (Thread thread : threads){
thread.start();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(cnt+" "+ String.valueOf(cnt==NUM*1000));
}
}
使用synchroinzed修飾符使執行緒同步
在Java中,每個物件都對應於一個monitor,其中有一個成為 互斥鎖(lock,muyex) 的標記,該標記用來保證任意時刻,只能有一個執行緒訪問該物件
synchronized的用法
- 對程式碼片段:synchronized (物件) { }
- 對某個方法:synchronized 放在方法宣告中,等價於synchronized(this),表明整個方法為同步方法
wait( )、notify( )/notifyAll( )函式控制執行緒
- wait釋放鎖,使當前執行緒進入等待狀態
- notify喚醒等待當前物件的執行緒,僅喚醒一個,若有多個選項,由作業系統決定
- notifyAll喚醒所有等待該物件的執行緒
- notify/notifyAll未釋放鎖,待synchronized臨界區結束後鎖才釋放
- 被喚醒的執行緒一定先處於wait狀態
2018/8/11