今天有小夥伴在後台問java多線程的概念,小編覺得先從掌握基本的線程概念開始,才能更加深刻的認知多線程,通俗的講就是多個並行運行的while循環,可以並發做多個事情,那麼多執行緒在實際使用過程中有可能會操作同一個資料塊,那麼問題多執行緒注意的問題就出現了。先來了解執行緒基本概念以及簡單程式碼實作
Java執行緒學習經典範例-讀寫者示範
Java執行緒學習最經典的例子-讀寫者,主要用到Thread相關知識如下:
-執行緒的start與run
-執行緒的休眠(sleep)
-資料對象加鎖(synchronized)
-資料對象的等待與釋放(wait and notify)
程式實作:
-ObjectDataData關鍵字實作加鎖,在執行緒讀寫者中使用。
-ConsumerThread消費者線程,讀取資料物件中count值之後,通知生產者線程
-ProductThread生產者線程,對資料物件中count值操作,每次加1,然後通知消費者線程
類結構圖如下:
程式碼實作
消費者-讀取執行緒
package com.gloomyfish.jse.thirdteen; public class ConsumerThread extends Thread { private ObjectData data; public ConsumerThread(ObjectData data) { this.data = data; } @Override public void run() { while(true) { try { synchronized (data) { data.wait(); data.read(); data.notify(); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
寫執行緒-生產者執行緒
package com.gloomyfish.jse.thirdteen; public class ProductThread extends Thread { private ObjectData data; public ProductThread(ObjectData data) { this.data = data; } @Override public void run() { while (true) { try { synchronized (data) { data.write(); Thread.sleep(3000); data.notify(); data.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
資料物件類別
package com.gloomyfish.jse.thirdteen; public class ObjectData { private int count; public ObjectData() { count = 0; } public void read() { System.out.println("read count : " + count); System.out.println(); } public void write() { count++; System.out.println("write count : " + count); } }
測試程式碼
public static void main(String[] args) { ObjectData data = new ObjectData(); ConsumerThread ct = new ConsumerThread(data); ProductThread pt = new ProductThread(data); ct.start(); pt.start(); }
資料物件類別
rrreee了執行緒之間如何透過wait與notify實現資料的讀寫同步控制。示範了Java的同步關鍵字synchronized的用法與執行緒的用法。 以上就是【java基礎】 執行緒實例的內容,更多相關內容請關注PHP中文網(www.php.cn)!