问题:
- 为什么在尝试删除最后一个元素时会收到 NoSuchElementException?
- 我该如何解决?
我有 3 个类(见下文)将整数添加/删除到 LinkedList。一切正常,直到删除线程到达最后一个元素。
似乎两个线程都试图删除它。第一个成功了,第二个不行。但我认为同步方法/同步属性 +!sharedList.isEmpty()
会处理这个问题。
类生产者: 这个类应该创建随机数,将它们放在sharedList中,向控制台写入它刚刚添加了一个数字并在它被中断时停止。预计只有 1 个此类线程。
import java.util.LinkedList;
public class Producer extends Thread
{
private LinkedList sharedList;
private String name;
public Producer(String name, LinkedList sharedList)
{
this.name = name;
this.sharedList = sharedList;
}
public void run()
{
while(!this.isInterrupted())
{
while(sharedList.size() < 100)
{
if(this.isInterrupted())
{
break;
} else
{
addElementToList();
}
}
}
}
private synchronized void addElementToList()
{
synchronized(sharedList)
{
sharedList.add((int)(Math.random()*100));
System.out.println("Thread " + this.name + ": " + sharedList.getLast() + " added");
}
try {
sleep(300);
} catch (InterruptedException e) {
this.interrupt();
}
}
}
Class Consumer:这个类应该删除 sharedList 中的第一个元素,如果它存在的话。执行应该继续(在被中断之后),直到sharedList为空。预计此类有多个(至少 2 个)线程。
import java.util.LinkedList;
public class Consumer extends Thread
{
private String name;
private LinkedList sharedList;
public Consumer(String name, LinkedList sharedList)
{
this.name = name;
this.sharedList = sharedList;
}
public void run()
{
while(!this.isInterrupted())
{
while(!sharedList.isEmpty())
{
removeListElement();
}
}
}
private synchronized void removeListElement()
{
synchronized(sharedList)
{
int removedItem = (Integer) (sharedList.element());
sharedList.remove();
System.out.println("Thread " + this.name + ": " + removedItem + " removed");
}
try {
sleep(1000);
} catch (InterruptedException e) {
this.interrupt();
}
}
}
类 MainMethod:这个类应该启动和中断线程。
import java.util.LinkedList;
public class MainMethod
{
public static void main(String[] args) throws InterruptedException
{
LinkedList sharedList = new LinkedList();
Producer producer = new Producer("producer", sharedList);
producer.start();
Thread.sleep(1000);
Consumer consumer1 = new Consumer("consumer1", sharedList);
Consumer consumer2 = new Consumer("consumer2", sharedList);
consumer1.start();
consumer2.start();
Thread.sleep(10000);
producer.interrupt();
consumer1.interrupt();
consumer2.interrupt();
}
}
例外:这是我得到的确切例外。
Consumer.removeListElement(Consumer. java:29) 在 Consumer.run(Consumer.java:20)