将List<T>
传递给附加到List
的单个线程,并确保此线程的Runnable 已完成执行(我需要在中途中断它并将数据计算到那一点),使用来自调用线程的List
是否安全?
我在我的代码中使用了这种方法,它似乎有效,但我不能感觉到我只是幸运,因为我的列表中的数据不易变,列表本身不提供同步访问。
我最好使用Collections.synchronizedList(..)
作为累加器并在我需要主线程中的列表时复制内容(在中断计算线程之后)?
代码示例:
List<MyData> accList = new ArrayList<>();
Future<?> compFuture = executor.submit(new ComputationRunnable(accList));
// The Runnable will add elements to the List
compFuture.cancel(true);
// Interrupt is caught in the Runnable and it returns null
// Try Future.get() to see if the Future was correctly cancelled, ignore Exception
compFuture.get();
useList(accList);
答案 0 :(得分:0)
这是因为列表不是用于多线程的
您可以使用BlockingQueue作为示例....
oracle可以直接找到更多信息: https://docs.oracle.com/javase/tutorial/essential/concurrency/collections.html