Skip to content

Instantly share code, notes, and snippets.

@fankay
Created January 10, 2018 06:21
Show Gist options
  • Save fankay/43d4faacc8b7b4a6db429dc06bc120ae to your computer and use it in GitHub Desktop.
Save fankay/43d4faacc8b7b4a6db429dc06bc120ae to your computer and use it in GitHub Desktop.
通过创建自定义阻塞集合演示线程中的Lock接口以及Condition类的使用
package com.kaishengit.ppt;
import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BlockList<T> {
private LinkedList<T> linkedList = new LinkedList<>();
private int minSize = 0;
private int maxSize;
private AtomicInteger elementSize = new AtomicInteger(0);
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public BlockList(int maxSize) {
this.maxSize = maxSize;
}
public void addElement(T t) {
lock.lock();
try {
while (elementSize.get() == maxSize) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
linkedList.add(t);
elementSize.addAndGet(1);
System.out.println("成功添加 " + t + " 元素");
condition.signal();
} finally {
lock.unlock();
}
}
public T getElement() {
T t = null;
try {
lock.lock();
while(elementSize.get() == minSize) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
t = linkedList.removeFirst();
System.out.println("元素" + t + "被取出");
elementSize.getAndDecrement();
condition.signal();
} finally {
lock.unlock();
}
return t;
}
public int getSize() {
return elementSize.get();
}
}
package com.kaishengit.ppt;
import java.util.concurrent.TimeUnit;
public class BlockListTest {
public static void main(String[] args) {
BlockList<String> blockList = new BlockList<>(5);
blockList.addElement("aa");
blockList.addElement("bb");
blockList.addElement("cc");
blockList.addElement("dd");
blockList.addElement("ee");
System.out.println("当前元素个数:" + blockList.getSize());
Thread AddThread = new Thread(new Runnable() {
@Override
public void run() {
blockList.addElement("XX");
blockList.addElement("YY");
blockList.addElement("ZZ");
}
},"AddThread");
AddThread.start();
Thread removeThread = new Thread(new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(1);
blockList.getElement();
TimeUnit.SECONDS.sleep(1);
blockList.getElement();
TimeUnit.SECONDS.sleep(1);
blockList.getElement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"removeThread");
removeThread.start();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment