一、synchronized+ Object.wait和notifyall
package com.sk.thread.wait;
public class waittest {
public static void main(String[] args) throws InterruptedException {
Object o = new Object();
A a = new A(o);
B b = new B(o);
new Thread(a,"A").start();
new Thread(b,"B").start();
}
}
class A implements Runnable {
private Object object;
public A(Object object) {
this.object = object;
}
public void run() {
synchronized (object){
for(int i =1;i<50;i++){
System.out.print("A线程"+i+"--");
if(i%2==0){
object.notifyAll();
try {
object.wait();
System.out.println("A执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
class B implements Runnable {
private Object object;
public B(Object object) {
this.object = object;
}
public void run() {
synchronized (object){
for(int i =1;i<50;i++){
System.out.print("B线程"+i+"--");
object.notifyAll();
try {
object.wait();
System.out.println("B执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
二、Lock+ Condition.awit和signal
package com.sk.thread.lock.condition;
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author: shenke
* @Description:
* @Date: Create in 2020-05-29 10:02
*/
public class ConditionQueue {
private LinkedList<Object> buff;//生成着容器
private int maxSize;//容器最大值
private Lock lock;
private Condition fullCondition;
private Condition notFullCondition;
public ConditionQueue(int maxSize) {
this.maxSize = maxSize;
buff=new LinkedList<Object>();
lock = new ReentrantLock();
fullCondition = lock.newCondition();
notFullCondition = lock.newCondition();
}
/*
* 生成者
* */
public void put(Object obj){
lock.lock();//获取锁
try {
while (maxSize == buff.size()){
notFullCondition.await();//满了,添加的线程进入等待队列
}
buff.add(obj);
fullCondition.signal();//通知
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void get(){
Object obj;
lock.lock();
try {
while (buff.size() ==0){
fullCondition.await();//队列中没有数据了 线程进入等待状
}
obj = buff.poll();
notFullCondition.signal();//通知生成者可以增加了
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
三、阻塞队列BlokingQueue
生产者:queue.put(o);
消费者:Object o = queue.take(); //自带锁和通知唤醒方法