notify,wait,synchronized實現線程間通知
阿新 • • 發佈:2017-05-08
java take 計數器 釋放 com 測試結果 con 最大 runnable
wait阻塞線程釋放鎖;notify使wait所在的線程被喚醒在次獲得鎖,並執行,但要等到notify所在的線程代碼全部執行後!
示例代碼如下:
package com.vhbi.service.impl; import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList; import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * Created by zzq on 2017/5/8.*/ public class TeamTest { private LinkedList _list = new LinkedList<Object>(); private int size = 0; private AtomicInteger atomicInteger = new AtomicInteger(); public TeamTest(int size) { this.size = size; } private final Object lock = new Object(); publicvoid take() throws Exception { synchronized (lock) { while (0 == atomicInteger.get()) {//計數器和最大值相等 lock.wait();//進入等待狀態,釋放鎖 } //被喚醒後 //1.計數器減一 atomicInteger.decrementAndGet(); //2.隊列去掉一個 Object currObj = _list.removeFirst(); System.out.println("------take------ " + currObj); //3.獲得鎖,喚醒wait執行線程的等待 lock.notify(); } } public void put(Object obj) throws Exception { synchronized (lock) { while (this.size == atomicInteger.get()) {//計數器和最大值相等 lock.wait();//進入等待狀態,釋放鎖 } //被喚醒後 //1.計數器加一 atomicInteger.incrementAndGet(); //2.隊列添加一個 _list.add(obj); System.out.println("------put------ " + obj); //3.獲得鎖,喚醒wait執行線程的等待 lock.notify(); } } }
測試結果代碼:
@org.junit.Test public void main2() throws Exception { final TeamTest teamTest = new TeamTest(5); teamTest.put(1); teamTest.put(2); teamTest.put(3); teamTest.put(4); teamTest.put(5); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { teamTest.put(6); } catch (Exception e) { e.printStackTrace(); } } }); t1.start(); Thread.sleep(5000); teamTest.take(); } @org.junit.Test public void main3() throws Exception { final TeamTest teamTest = new TeamTest(5); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { teamTest.take(); } catch (Exception e) { e.printStackTrace(); } } }); t1.start(); Thread.sleep(5000); teamTest.put(1); teamTest.put(2); }
notify,wait,synchronized實現線程間通知