I’m new to using threads and just trying to figure things out. My end game is to have a list of URLs, my program will take one URL from the list at a time and perform an action using that URL. There’ll be a lot of URLs and this list may possibly be added to while some threads are using the same list.
To start experimenting and learning I’m using a simple ArrayList filled with numbers and am using a threaded pool to get the URLs. Here’s my code:
public static void main(String[] args) {
for (int i = 0; i < 200; i++){
test.add(i);
}
SlothTest runner = new SlothTest();
Thread alpha = new Thread(runner);
Thread beta = new Thread(runner);
ExecutorService tasker = Executors.newFixedThreadPool(10);
while (!listEmpty()){
tasker.submit(new SlothTest());
}
tasker.shutdown();
System.out.println("Complete...");
}
@Override
public void run() {
getLink();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
}
}
private synchronized String getLink(){
link = Thread.currentThread().getName() + " printed " + test.indexOf(test.size()-1);
test.remove(test.size()-1);
System.out.println(link);
return link;
}
private synchronized static boolean listEmpty(){
if (test.size() > 0){
return false;
} else {
return true;
}
}
I’m running into some concurrency issues while running the program and getting some -1’s for my output. I’m not sure why this is happening and I know my above code is rough but I’m really in the learning stage a multi-threaded apps. Can anyone help me first off with fixing my concurrency issue and then if you can give me any pointers about my above code that would also be great
One problem is that
is not atomic. So
listEmptymight return false, but become true by the time you reach the next statement.Another one is that you synchronize on two different monitors:
Have you considered using a
BlockingQueueinstead of a list, which has useful methods for what you are trying to achieve.