1. 程式人生 > >多執行緒初探之使用Lock實現生產-消費模式

多執行緒初探之使用Lock實現生產-消費模式

前言

在上篇文章中使用的是wait和notify以及synchronized關鍵字配合實現了執行緒間的通知,實現了生產-消費模型。本篇文章將使用Lock技術來實現上述模型。

Lock介紹

Lock是jdk1.5的產物,在此之前我們只能使用synchronized關鍵字來進行同步,但是synchronized是一個悲觀鎖機制,不能響應中斷。Lock是一個介面,使用者需要手動申請鎖,手動釋放鎖,通過Condition類來完成執行緒的暫停以及喚醒其他執行緒的工作。

實現Manager

package com.yzz.java;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public
class Manager { private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private int count; public void product(int a) { try { lock.lock(); while (count < 100) { if (count > a) { System.out
.println("執行緒" + Thread.currentThread().getName() + "生產者需要生產" + a + "件商品 count:" + count+"等待"); condition.await(); } count += a; condition.signalAll(); System.out.println("執行緒" + Thread.currentThread().getName() + "生產者生產了"
+ a + "件商品 count:" + count); } } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void custum(int b) { try { lock.lock(); if (count < b) { System.out.println("執行緒" + Thread.currentThread().getName() + "生產者需要消費" + b + "件商品 count:" + count+"等待"); condition.await(); }else{ count -= b; condition.signalAll(); System.out.println("執行緒" + Thread.currentThread().getName() + "消費者消費了" + b + "件商品 count:" + count); } } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } }

實現生產者


package com.yzz.java;

public class Producter extends Thread{

    private Manager manager;
    private int b;
    public Producter(Manager manager,int b,String name) {
        this.manager = manager;
        this.b = b;
        setName(name);
    }

    @Override
    public void run() {
        super.run();
        manager.product(b);
    }
}

實現消費者


package com.yzz.java;

public class Consumer extends Thread{

    private Manager manager;
    private int a;
    public Consumer(Manager manager,int a,String name) {
        this.manager = manager;
        this.a = a;
        setName(name);
    }

    @Override
    public void run() {
        super.run();
        manager.custum(a);
    }
}

測試

package com.yzz.java;

public class Test {

    public static void main(String[] args) {
        Manager manager = new Manager();
        Producter producter1 = new Producter(manager,2,"生產者1");
        Producter producter2 = new Producter(manager,1,"生產者2");
        Producter producter3 = new Producter(manager,1,"生產者3");

        Consumer consumer1 = new Consumer(manager, 12, "消費者1");
        Consumer consumer2 = new Consumer(manager, 23, "消費者2");
        Consumer consumer3 = new Consumer(manager, 1, "消費者3");
        Consumer consumer4 = new Consumer(manager, 3, "消費者4");
        Consumer consumer5 = new Consumer(manager, 8, "消費者5");
        Consumer consumer6 = new Consumer(manager, 46, "消費者6");

        producter1.start();
        producter2.start();
        producter3.start();

        consumer1.start();
        consumer2.start();
        consumer3.start();
        consumer4.start();
        consumer5.start();
        consumer6.start();
    }
}

這裡寫圖片描述