1. 程式人生 > >notify,wait,synchronized實現線程間通知

notify,wait,synchronized實現線程間通知

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(); public
void 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實現線程間通知