Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java列表从列表中的不同线程收集结果_Java_Multithreading_Arraylist - Fatal编程技术网

Java列表从列表中的不同线程收集结果

Java列表从列表中的不同线程收集结果,java,multithreading,arraylist,Java,Multithreading,Arraylist,我有几个创建结果值(对象)的计算线程。每个线程完成后,将调用结果收集器中的“add”方法。此结果收集器是单例的,因此只有一种表示形式 结果收集器内有一个列表,其中保存结果对象: List results=Collections.synchronizedList(新的ArrayList()) add方法将每个线程的结果添加到列表中: public void addResult(TestResult result){ System.out.println("added " + r

我有几个创建结果值(对象)的计算线程。每个线程完成后,将调用结果收集器中的“add”方法。此结果收集器是单例的,因此只有一种表示形式

结果收集器内有一个列表,其中保存结果对象:

List results=Collections.synchronizedList(新的ArrayList())

add方法将每个线程的结果添加到列表中:

  public void addResult(TestResult result){
        System.out.println("added " + result.getpValue());
        this.results.add(result);
    }
在计算完成后,它在线程内被调用

最大的问题是:所有线程完成后,结果列表为空。正如您在addResult方法中看到的,我为pValue添加了一个print语句。打印出所有结果的p值

所以看起来线程在不同的列表上工作。尽管收集器类是单例的

它被要求提供结果收集器的完整代码(Javadoc被删除以调整大小)


同步列表只是列表上的包装器。实际上,在现代Java中,您应该为此目的使用并发集合;它们实现了更智能、更高效的锁定,并提供了更好的性能

注意事项:唯一同步的列表是在写入时复制的列表。因此,如果这是一个问题(即,您添加的内容多于迭代),那么您的方式是好的)*

您的代码中的错误几乎肯定在您尚未显示的singleton类中。要么你的类不是真正的单例(你使用了枚举吗?这是一个很好的保证),要么你的列表创建比让它更混乱

如果你发布更多代码,我可以用更多信息更新答案:)


编辑:根据您更新的代码,我认为您的问题在这里:

exe.shutdown();
您需要等待执行器完成waitTermination(),并有一个与您正在做的工作相关的良好超时

您的线程立即开始并消失:)

例如:

taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);

从这里开始:

添加到上面的正确答案中

是的,
exe.shutdown()是问题所在,但线程不会立即消亡,相反,它们似乎会运行。这就是为什么“添加”方法在扩展为打印时打印所有内容都是正确的


问题是,我的输出是在线程完成计算之前完成的。因此,在线程完成和打印工作后不久,当时没有任何值。

能否提供收集器(Singleton)类的源代码?请提供您的代码…我目前还没有发现任何错误。。。除非我遗漏了什么。我们可能需要更多的代码。您的线程执行代码是否紧凑到可以发布?您是指我调用/执行线程的部分?或者更深一层,调用计算并将结果添加到收集器?附带说明:singleton本身不是线程安全的。执行一个
私有静态最终结果采集器ResultCollector=newresultCollector()
,并在
getInstance
方法中省略
==null
检查。@GregHilston我不会坐在那里等注释出现。我只是提供我能提供的任何有用的信息,并在我有时间的时候更新(我正在工作,并试图成为一个乐于助人的人,而不是坐在那里等分数)。这个网站是为了给人们提供一些帮助,我的回答比你的一句话提供了更多的帮助。@GregHilston取决于你的“占位符”是否越过了界限,成为了一个对一个广泛问题可能有用但宽泛的答案。这一个有,虽然几乎没有。简单的澄清是一种评论。@JohnHumphreys-w00te不确定您是否对我的评论感到不安,但我是在问,因为您显然是一位经验丰富的用户,并且正在尝试学习如何适当地询问更多信息。只是想澄清我的意图。谢谢你提供的信息。克丽丽丝,谢谢你well@GregHilston-哦,对不起,格雷格,那么我道歉。我过去很讨厌人们对我嗤之以鼻;很多人(我认为这是一个工程师的事情)。老实说,只要你试着帮助你发布的东西,在这里就可以了。我对造成的混乱表示歉意;肯定误解了你的评论。无论如何,评论是有用的东西;所以我会在这之后停止。@JohnHumphreys-w00te一点问题都没有!在纯文本通信中,要理解所描绘的声音的预期“语调”是非常困难的,这就是我想澄清的原因。谢谢你教我!
exe.shutdown();
taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);