Skip to content

Instantly share code, notes, and snippets.

@fankay
Created January 10, 2018 02:54
Show Gist options
  • Save fankay/e1e124f7c36d219987e82656159b4e4f to your computer and use it in GitHub Desktop.
Save fankay/e1e124f7c36d219987e82656159b4e4f to your computer and use it in GitHub Desktop.
通过创建自定义阻塞集合演示线程中的wait方法以及notify方法的使用
package com.kaishengit.ppt;
import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicInteger;
public class BlockList<T> {
private LinkedList<T> linkedList = new LinkedList<>();
private int minSize = 0;
private int maxSize;
private AtomicInteger elementSize = new AtomicInteger(0);
private Object lock = new Object();
public BlockList(int maxSize) {
this.maxSize = maxSize;
}
public void addElement(T t) {
synchronized (lock) {
while (elementSize.get() == maxSize) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
linkedList.add(t);
elementSize.addAndGet(1);
System.out.println("成功添加 " + t + " 元素");
lock.notify();
}
}
public T getElement() {
T t = null;
synchronized (lock) {
while(elementSize.get() == 0) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
t = linkedList.removeFirst();
System.out.println("元素" + t + "被取出");
elementSize.getAndDecrement();
lock.notify();
}
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