Trying to process a list of Order objects with two different threads, but running into the following exception:
Exception in thread "Thread 1" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at TaskThread.run(PrintOrder_Priority.java:193)
at java.lang.Thread.run(Unknown Source)
Thread 1:Processing Order234,7
Thread 2:Processing Order235,6
Thread 1:Processing Order237,5
Thread 2:Processing Order236,4
I have just omitted the Order class details, which contains fields such as id
and priority
. I have sorted the list of orders based on their priority, and want to process the orders.
class TaskThread implements Runnable
{
List<Order> orderList;
static volatile int i=0;
Semaphore sem1;
Semaphore sem2;
TaskThread(List<Order> orderList,Semaphore sem1,Semaphore sem2)
{
this.orderList=orderList;
this.sem1=sem1;
this.sem2=sem2;
}
@Override
public void run()
{
for(;i<orderList.size();)
{
try
{
sem1.acquire();
orderList.get(i).ProcessOrder();
i++;
sem2.release();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
Contents of the main
method:
Semaphore sem1 = new Semaphore(1);
Semaphore sem2 = new Semaphore(0);
Thread T1 = new Thread(new TaskThread(aList,sem1,sem2));
Thread T2 = new Thread(new TaskThread(aList,sem2,sem1));
T1.setName("Thread 1");
T1.start();
T2.setName("Thread 2");
T2.start();