Java實現線程的同步,可以通過synchronized,wait(), notitfy(), notifyAll();假設一個線程(生產者)生產產品,一個線程(消費者)消費產品,其訪問的資源時間都是隨機的,這樣就是生產者必須得產品(資源)消費完成之後才可以生產,而消費者必須在產品有的時候才可以消費,這就是必須對資源進行同步操作,對資源的使用部分的代碼需要加入鎖。
下列是我的實現方法:
package com.lzb.common; import java.util.Random; import java.util.concurrent.TimeUnit; /** * * 功能描述:生產者消費者 * 註:鎖synhronized是放在“資源的類的內部方法中”,而不是線上程的代碼中 */ public class ProducterCustomer { private PCResource pc = new PCResource(); // 生產者與消費者調用的時間隨機 private Random rand = new Random(50); public void init() { // 生產者 new Thread(new Runnable(){ public void run() { while(true) { pc.producter(); try { TimeUnit.MILLISECONDS.sleep(rand.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } } }}).start(); // 消費者 new Thread(new Runnable(){ public void run() { while(true) { pc.customer(); try { TimeUnit.MILLISECONDS.sleep(rand.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } } }}).start(); } public static void main(String[] args) { ProducterCustomer startPc = new ProducterCustomer(); startPc.init(); } } /** * * 功能描述:同步資源 * */ class PCResource { private static final Integer MAX = 1; private static final Integer MIN = 0; private int product = 0; // 同步互斥通訊標誌 private boolean isRunning = true; /** * * 功能描述:生產產品,當生產一個商品後掛起,等待消費者消費完成 */ public synchronized void producter() { while(isRunning) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } product++; System.out.println("-------->Product " + product + " good"); if(product >= MAX) break; } isRunning = false; notify(); } /** * * 功能描述:消費者,消費產品,當產品為0時,等待生產者生產產品 */ public synchronized void customer() { while(!isRunning) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } product--; System.out.println("Limit " + product + " goods<----------"); if(product <= MIN) { break; } } isRunning = true; notify(); } }