使用多线程对集合数据进行添加和移除的并发安全操作
生产者:Test2_Producer.java
package cn.tedu.Thes2_Thread;
import java.util.LinkedList;
import java.util.Random;
public class Test2_Producer extends Thread{
private LinkedList<Character> list;
public Test2_Producer(LinkedList<Character> list) {
this.list = list;
}
@Override
public void run() {
while (true) {
char c = (char)('a' + new Random().nextInt(26));
synchronized (list) {
list.add(c);
System.out.println("<<"+c);
}
}
}
}
消费者:Test2_Producer.java。存在消费完毕之后,空集合执行消费操作的情况,此时消费者线程死机,只剩下生产者线程,所以有判断消费行为之前添加挂起操作,用给集合加锁的方式进行限制,再通过主线程并发执行生产者线程之后唤醒消费者。
package cn.tedu.Thes2_Thread;
import java.util.LinkedList;
public class Test2_Consumer extends Thread{
private LinkedList<Character> list;
public Test2_Consumer(LinkedList<Character> list) {
this.list = list;
}
@Override
public void run() {
while(true) {
synchronized (list) {
while(list.size() == 0) {
try {
list.wait();
} catch (Exception e) {
}
}
Character c = list.removeFirst();
System.out.println(">>>>"+c);
}
}
}
}
测试类:
package cn.tedu.Thes2_Thread;
import java.util.LinkedList;
public class Test2_Test {
public static void main(String[] args) throws Exception {
LinkedList<Character> list = new LinkedList<Character>();
Test2_Producer p = new Test2_Producer(list);
Test2_Consumer c = new Test2_Consumer(list);
p.start();
Thread.sleep(1000);
c.start();
while (true) {
synchronized (list) {
list.notifyAll();
}
}
}
}