Недавно я усложнил эту длинную задачу, и с тех пор предложения Exception внутри этой ExpensiveTask вызываются, когда выполнялось в нескольких потоках:
- NullPointerException
- ConcurrentModificationException (вызывается для объектов, к которым обращается только один поток!)
о доступе к внутренним структурам данных.
Код: Выделить всё
//int NUMBER_OF_THREADS = 1;//works perfectly
int NUMBER_OF_THREADS = 2;//2 and more cause internal ExpensiveTask Exception for some threads.
ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS);
// Shared result container
ConcurrentMap globalSimDataMap = new ConcurrentHashMap();
for (int i = 0; i < NUMBER_OF_THREADS; i++) {
executor.submit(() -> {
try {
System.out.println("Task " + Thread.currentThread().getName());
ExpensiveTask expensiveTaskInstance=null;
try{
expensiveTaskInstance = new ExpensiveTask();
} catch(Exception e){
//Here is where the program falls down when multithreading implemented
e.printStackTrace();
Thread.currentThread().interrupt();
}
// Get simulation results from this thread
expensiveTaskInstance.getSimulationRecord();
// Aggregate results into the global map
/*
* @TODO
*/
} finally {
latch.countDown();
}
});
}
try{
latch.await(); // Wait for all threads to complete
executor.shutdown(); // Shut down the executor
} catch(Exception e){
e.printStackTrace();
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-issues
Мобильная версия