多執行緒 01 基礎

2021-09-20 21:21:46 字數 2529 閱讀 4952

乙個程序可以有多個執行緒,如你開啟qq是乙個程序,但是聊天、開語音可能是乙個乙個的執行緒。

thread類實現了runnable介面。

繼承thread,實現了runnable介面。

呼叫:

runnabel是個介面,要通過實現類來進行呼叫。

start方法是啟動乙個執行緒,run方法是呼叫乙個方法。

sleep():執行緒阻塞不會釋放鎖,。

wait():執行緒阻塞會釋放當前的鎖,但是需要通過notify()來搭配使用,喚醒wait。

yeild():暫時讓出cpu時間(一次,並不會一直讓)。讓其他執行緒去執行。

join():合併執行緒。

volatile:關鍵字是為了解決執行緒之間的可見性問題。

synchronized:既可以解決可見性也可以解決原子性問題。

什麼是原子性:方法或**塊會執行完之後別的執行緒才可以來進行執行。

lock:可以完全替代synchronized,而且lock更加靈活。但是使用lock必須要手動釋放鎖unlock(),所以unlock常常會放在finally當中,以防發生異常。而且lock可以通過trylock()方法嘗試獲取鎖。

死鎖: 程式執行不下去了,一直處於等待或者鎖住狀態,釋放不了。

如何避免: 注意方法呼叫的順序

有順序的呼叫

lock,超時檢測

jconsole工具檢測

消費者+生產者+容器大小

可以使用wait、notifyall來實現。

public class thread_producer_consumer  catch (interruptedexception e1) 

synchronized (o) catch (interruptedexception e)

}num++;

system.out.println("++目前緩衝區裡已經有:" + num);

o.notify();}}

}}).start();;

// 消費者

new thread(new runnable() catch (interruptedexception e1)

synchronized (o) catch (interruptedexception e)

}num--;

system.out.println("--目前緩衝區裡已經有:" + num);

// notify並不會釋放鎖,只會喚醒了其他執行緒。

o.notify();

system.out.println("t_notify以後");

/** for (int i = 0; i < 100; i++) */}

}}}).start();;

}}

可以使用lock,unlock來實現。

區別: 使用lock效率更高,因為可以指定釋放的是消費者或者生產者其中的一方。其中await()相當於wait(),signalall()相當於notifyall()。

我靠,搞了我乙個多小時時間。

用@test注釋方法,來進行測試不會管子執行緒是否還存活著,只有自己主線程執行完後就退出了jvm,程式自動關閉了。太坑了。

countdownlatch:允許乙個或多個執行緒等待直到在其他執行緒中執行的一組操作完成的同步輔助。

countdownlatch裡面有兩個主要方法,await(),countdown(),getcount()。

await():阻塞執行緒,除非getcount()為0就釋放,countdown()方法每次減一。

01多執行緒基礎

1 多執行緒 為了提高程式執行效率 什麼是執行緒 執行緒就是一條程式執行路徑或者執行流程 什麼是程序 執行中的程式,每個程序都有一條主線程,在實際執行中,程序也可以理解為多個執行緒的集合。2 多執行緒應用場景 3 建立執行緒有哪些方式 1 使用繼承tread類方式,重寫run方法 2 使用實現run...

多執行緒整理01 多執行緒概述

什麼是程式?程式是一段由作業系統執行的 什麼是程序?程序是程式執行的過程,或者說正在被執行的一道程式,乙個程序由乙個或者多個執行緒組成 什麼是執行緒?執行緒是程序的執行部分,每個執行緒都有各自的堆疊空間,堆疊是私有的,而執行緒共享程序內的其他資源 什麼是併發和並行 併發 如果只有單個cpu的話,程式...

執行緒基礎01

注意 執行緒thread的構造方法 執行緒thread常用api 執行緒同步 多個執行緒,共享資源 載入和顯示兩個執行緒 執行緒池程式 程序執行緒 重寫 run 方法 建立自定義的執行緒物件 開啟執行緒 start thread t newmythread1 執行緒1 t.start 重寫 run ...