【发布时间】:2016-06-03 13:21:29
【问题描述】:
这里是示例代码
1) ArrayList 是一个单独的对象,它被传递给 ThreadPool 的每个线程。
2) 在执行结束时列表大小应该是 50,如果您检查示例输出,它可能不是 50。有时它可能是 41 或 47,为什么会这样。
public class Test {
ArrayList list=new ArrayList();
public static void main(String[] args) {
ExecutorService executorService3 = Executors.newScheduledThreadPool(10);
Test test=new Test();
for(int i=0;i<5;i++)
{
Mythread t1=new Mythread(test.list);
executorService3.execute(t1);
}
executorService3.shutdown();
while(executorService3.isShutdown())
{
//---This is not giveging proper output as expected is 50.--
System.out.println("List size="+test.list.size());
break;
}
}
}
class Mythread implements Runnable {
List list=null;
Mythread(List list) {
this.list=list;
}
@Override
public void run() {
for(int i=0;i<10;i++) {
this.list.add(i);
}
}
}
【问题讨论】:
-
您的
Mythread类不是线程。在其名称中看到“线程”令人困惑。您提交给ExecutorService的事物的通用名称是“任务”。MyTask将是该类的更好名称。 -
问:
main()例程中的while循环应该完成什么?executorService3.isShutdown()将在第一次和每次调用时返回true,因为您的主线程在上面的行中关闭了服务。也许你应该使用executorService3.awaitTermination()。 -
问:你的意思是在你的问题标题中写“异步”吗?还是那是一个错字?您的线程在访问
List时确实不使用同步,但“异步”是一种非常规的编写方式。大多数人会说“不同步”或“不同步”。不同之处在于,“异步”听起来像是您主动做了一些事情来删除同步,而“不同步”则更被动(即,您忽略了它。) -
Re, "At end of execution list size should be 50" 实际上,由于您的代码允许多个线程在不同步的情况下更新列表,因此您应该不期待这样的结果.如果您更改代码以在检查列表长度之前等待所有任务终止,您可能会得到该结果,但不能保证获得该结果。
-
这个程序应该会导致邪恶的事情发生,因为它正在修改一个没有任何同步的列表。你应该预期结果会很糟糕。
标签: java multithreading arraylist add