一、Condition
功能介绍:线程间通讯的另一种方式,他的功能和Lock几乎一样
案例说明:下面案例中Condition通过await进行阻塞,然后用single进行唤醒
package com.gpdi.security.condition;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class ConditionAwait implements Runnable {
private Lock lock;
private Condition condition;
public ConditionAwait(Lock lock, Condition condition) {
this.lock = lock;
this.condition = condition;
}
@Override
public void run() {
lock.lock();//获取锁
try {
System.out.println("begin Condition await");
condition.await();//阻塞
System.out.println("end Condition await");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();//释放锁
}
}
}
package com.gpdi.security.condition;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class ConditionSingle implements Runnable {
private Lock lock;
private Condition condition;
public ConditionSingle(Lock lock, Condition condition) {
this.lock = lock;
this.condition = condition;
}
@Override
public void run() {
lock.lock();//获取锁
try {
System.out.println("begin Condition Single");
condition.signal();//唤醒
System.out.println("end Condition Single");
} finally {
lock.unlock();//释放锁
}
}
}
package com.gpdi.security.condition;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionTest {
public static void main(String[] args) {
Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();
new Thread(new ConditionAwait(lock,condition),"thread0").start();
new Thread(new ConditionSingle(lock,condition),"thread0").start();
}
}
二、BlockQueue
功能介绍:阻塞队列(主要用于生产者消费者模型)
案例使用:
package com.gpdi.security;
import java.util.concurrent.ArrayBlockingQueue;
/**
* description:生产者消费者模式
*
*/
public class ArraysBlockQueueDemo {
ArrayBlockingQueue<String> ab = new ArrayBlockingQueue<>(10);
{
init();
}
public void init() {
new Thread(() -> {
while (true) {
try {
String data = ab.take();
System.out.println("receive data" + data);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "thread1").start();
}
public void addData(String data) {
System.out.println("send data" + data);
ab.add(data);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ArraysBlockQueueDemo arraysBlockQueue = new ArraysBlockQueueDemo();
for (int i = 0; i < 100; i++) {
arraysBlockQueue.addData("data" + i);
}
}
}