我的 2 个线程是生产者和消费者 here.When 我 运行 它在 removeFirst() 上抛出 nosuchelementexception 的程序 call.Can 有人解释
My 2 Threads are Producer&Consumer here.When i run the program it throws nosuchelementexception on removeFirst() call.Can someone explain
public class Processor {
LinkedList<Integer> list = new LinkedList<Integer>();
public static final int LIMIT = 10;
public void producer() throws InterruptedException {
Random random = new Random();
synchronized (this) {
while (true) {
list.add(random.nextInt(100));
if (list.size() > LIMIT) {
wait();
}
}
}
}
public void consumer() throws InterruptedException {
Thread.sleep(1000);
synchronized (this) {
while (true) {
int value = list.removeFirst();
System.out.println("removed value is..." + value);
if (list.size() < LIMIT) {
notify();
}
}
}
}
}
请解释为什么我在上面的代码中没有得到这样的元素异常。生产者和消费者是 2 个线程,如果我 运行 在 removeFirst() 上得到 nosuchelementexception。
生产者进入同步块并向链表添加11个元素。由于11大于10,它等待,从而释放锁,让消费者进入同步块。
消费者然后在同步块内启动无限循环,在每次迭代时从列表中删除一个元素。它从不调用 wait()
,也从不跳出 while 循环。所以它永远不会释放锁,并且永远迭代。读取第 11 个元素后,列表为空,因此出现异常。
public class Processor {
LinkedList<Integer> list = new LinkedList<Integer>();
public static final int LIMIT = 10;
public void producer() throws InterruptedException {
Random random = new Random();
synchronized (this) {
while (true) {
list.add(random.nextInt(100));
if (list.size() > LIMIT) {
wait();
}
}
}
}
public void consumer() throws InterruptedException {
Thread.sleep(1000);
synchronized (this) {
while (true) {
int value = list.removeFirst();
System.out.println("removed value is..." + value);
if (list.size() < LIMIT) {
notify();
}
}
}
}
}
请解释为什么我在上面的代码中没有得到这样的元素异常。生产者和消费者是 2 个线程,如果我 运行 在 removeFirst() 上得到 nosuchelementexception。
生产者进入同步块并向链表添加11个元素。由于11大于10,它等待,从而释放锁,让消费者进入同步块。
消费者然后在同步块内启动无限循环,在每次迭代时从列表中删除一个元素。它从不调用 wait()
,也从不跳出 while 循环。所以它永远不会释放锁,并且永远迭代。读取第 11 个元素后,列表为空,因此出现异常。