多線程中的兩個問題探討
問題提出
問題1 多線程中如何保證主線程等待所有子線程運行完畢再執行?
問題2 多個線程同時對一個資源文件進行讀/寫操作,是如何保證有序進行的呢?
解答思路及源碼
對於第一個問題,我想了兩種方法。下面就進行介紹吧。
第一種方法採用join()
第二種方法採用JUC包中的倒計時器CountDownLatch和信號量Semaphore工具類實現
輸出結果
Thread 1 Enter
Thread 1 Out
Thread 2 Enter
Thread 2 Out
Thread 3 Enter
Thread 3 Out
Main Thread
第二個問題,思路是線程間的通信原理,可以使用等待/喚醒機制wait/notify notifyAll 或者鎖Lock的await/signal實現。主要是存在一個共享文件的鎖的同步。
例如:有兩個線程同時讀或寫操作一個txt文件,假設我們考慮2個寫線程
線程1 :寫入 hello world
線程2 :寫入 concurrent thread
保證線程1和線程2是交替執行,寫入到hello.txt文件中。
步驟1 先創建一個WRFile類,包含2個方法write1(),write2()
步驟2 創建新建2個線程類,FirstThread,SecondThread。一個線程專門寫入hello world,另一個線程專門寫入 concurrent thread
步驟3 編寫一個Main函數,創建2個線程對象和一個WRFile對象,同時他們共享同一個WRFile對象鎖
最後 啟動2個線程。
輸出結果:
hello world
concurrent thread
hello world
concurrent thread
…
總結:
java中的多線程是難掌握的一項技術,只有多加練習和深入源碼剖析才能掌握它的精髓,其次還要看書,理解它的原理。
參考書目
1zhangpan_soft博客http://blog.csdn.net/zhangpan_soft/article/details/52415238
2飄楊……博客 https://www.cnblogs.com/tony-yang-flutter/p/3506421.html
3Doug Lea Java並發編程實現 機械工業出版社
TAG:dengyu的博客 |