Java學習(28)—(執行緒的控制/生命週期/解決安全問題)
執行緒的控制
休眠執行緒
public class ThreadSleep extends Thread {
@Override publicvoid run() {
for ( int x = 0; x < 100; x++) {
System. out .println(getName() + ":" + x + ", 日 期 : " + newDate());
// 睡眠
// 困了,我稍微休息 1 秒鐘try {
Thread. sleep (1000);
} catch (InterruptedException e)
{ e.printStackTrace();
}
}
}
}
加入執行緒
publicclass ThreadJoin extends Thread {
@Override publicvoid run() {
for ( int x = 0; x < 100; x++) {
System. out .println(getName() + ":" + x);
}
}
}
ThreadJoin tj1 = new ThreadJoin();
ThreadJoin tj2 = new ThreadJoin();
ThreadJoin tj3 = new ThreadJoin();
tj1.setName(" 李淵 " );
tj2.setName(" 李世民 " );
tj3.setName(" 李元霸 " );
tj1.start(); try {
// 李淵執行完,再執行其他兩個
tj1.join();
} catch (InterruptedException e) { e.printStackTrace();
}
tj2.start();
tj3.start();
禮讓執行緒
publicclass ThreadYield extends Thread {
@Override publicvoid run() {
for (int x = 0; x < 100; x++) {
System. out .println(getName() + ":" + x);
// 讓其他執行緒先走
Thread. yield ();
}
}
}
後臺執行緒
ThreadDaemon td1 = new ThreadDaemon();
ThreadDaemon td2 = new ThreadDaemon();
td1.setName(" 關羽 " );
td2.setName(" 張飛 " );
// 設定守護執行緒,主執行緒結束後,守護執行緒也會結束
td1.setDaemon(true); td2.setDaemon(true);
td1.start();
td2.start();
// 設 置 主 線 程 名 為 “ 劉 備 ”
Thread.currentThread().setName(" 劉備 " );
for ( int x = 0; x < 5; x++) {
System.out.println(Thread.currentThread().getName() + ":" + x);
}
終止執行緒
public class ThreadStop extends Thread {
@Override
public void run() {
System. out.println(" 開始執行: " +new Date());
// 我要休息 10 秒鐘,親,不要打擾我哦
try {
Thread.sleep(10000);
}catch(Interrupted Exception e) {
// e.printStackTrace();
System.out.println( " 執行緒被終止了" );
}
System. out .println(" 結束執行: " +new Date());
}
}
ThreadStop ts =new ThreadStop();
ts.start();
// 你超過三秒不醒過來,我就乾死你
try { Thread.sleep(3000);
// ts.stop(); ts.interrupt();
} catch (InterruptedException e)
{
e.printStackTrace();
}
執行緒的生命週期
多執行緒安全問題
判斷一個程式是否有執行緒安全問題的依據 )
A:是否有多執行緒環境
B:是否有共享資料
C:是否有多條語句操作共享資料
同步解決執行緒安全問題
同步程式碼塊
synchronized( 物件 ) {
需要被同步的程式碼 ;
}
這裡的鎖物件可以是任意物件。
synchronized(d) { if(tickets > 0) {
try { Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " 正在出售第 " + (tickets--) + " 張 票 " );
}
}
同步方法
把同步加在方法上。這裡的鎖物件是 this
privatesynchronizedvoid sellTicket() { if(tickets > 0) {
try {
Thread.sleep(100);
} catch(InterruptedException e)
{ e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+" 正在出售第 " + (tickets--) + " 張 票 " );
}
}
靜態同步方法
把同步加在方法上。
這裡的鎖物件是當前類的位元組碼檔案物件(反射再講位元組碼檔案物件) private static synchronized void sellTicket() {
if (tickets > 0) {
try {
Thread.sleep(100);
}
catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " 正在出售第 " + (tickets--) +" 張票 " );
}
}
同步鎖物件
// 定義票
private int tickets = 100;
// 定義鎖物件
private Lock lock =new ReentrantLock();
@Override
public void run() {
while (true) {
try{
// 加鎖
lock.lock();
if (tickets > 0) {
try {
Thread.sleep(100);
}
catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " 正在出售第 " + (tickets--) +" 張票 " );
}
}finally{
// 釋放鎖
lock.unlock();
}
}
}
同步的好處
同步的出現解決了多執行緒的安全問題。
同步的弊端
當執行緒相當多時,因為每個執行緒都會去判斷同步上的鎖,這是很耗費資源的, 無形中會降低程式的執行效率。
相關文章
- Java—執行緒的生命週期及執行緒控制方法詳解Java執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- Java執行緒的生命週期Java執行緒
- 【Java】【多執行緒】執行緒的生命週期Java執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- Java之執行緒的生命週期Java執行緒
- 死磕 java執行緒系列之執行緒的生命週期Java執行緒
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- 圖解 Java 執行緒的生命週期,看完再也不怕面試官問了圖解Java執行緒面試
- 見過描述得最好的Java執行緒生命週期Java執行緒
- Java中解決多執行緒資料安全問題Java執行緒
- 建立執行緒的4種方法 and 執行緒的生命週期執行緒
- Java執行緒生命週期與狀態切換Java執行緒
- iOS執行緒生命週期的監控iOS執行緒
- JAVA面試題 執行緒的生命週期包括哪幾個階段?Java面試題執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- 多執行緒的安全問題及解決方案執行緒
- Java面試必考題之執行緒的生命週期,結合原始碼,透徹講解!Java面試執行緒原始碼
- Python執行緒安全問題及解決方法Python執行緒
- 深入JAVA執行緒安全問題Java執行緒
- 執行緒的【生命週期】和【執行緒的同步】(多視窗售票例子)執行緒
- Java 執行緒安全問題的本質Java執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java併發程式設計實戰(5)- 執行緒生命週期Java程式設計執行緒
- 執行緒的生命週期,真的沒那麼簡單執行緒
- 優雅的解決Retrofit RxAndroid關聯生命週期問題Android
- ArrayList 的執行緒安全問題執行緒
- 10 張圖聊聊執行緒的生命週期和常用 APIs執行緒API
- Java開發學習(五)----bean的生命週期JavaBean
- 圖解React的生命週期及執行順序圖解React
- 03 執行緒安全問題執行緒
- SimpleDateFormat 執行緒安全問題ORM執行緒
- 學習vue生命週期Vue
- java 執行緒安全問題,解決執行緒安全問題——同步程式碼塊,同步方法,Lock鎖,Object類中wait方法,notify方法。等待喚醒案例。Java執行緒ObjectAI
- java 執行緒學習Java執行緒
- 詳解Java執行緒安全Java執行緒
- parallelStream中的執行緒安全問題Parallel執行緒
- 多執行緒併發安全問題詳解執行緒