Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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 for循环中的并发方法执行_Java_Concurrency - Fatal编程技术网

Java for循环中的并发方法执行

Java for循环中的并发方法执行,java,concurrency,Java,Concurrency,有以下方法: public void method(Collection<BigInteger> objectIds) { Collection<BigInteger> allObjectIds = new HashSet<BigInteger>(objectIds); for(BigInteger objId : allObjectIds) { SomeObject obj = getObjectById(objId); //

有以下方法:

public void method(Collection<BigInteger> objectIds) {
    Collection<BigInteger> allObjectIds = new HashSet<BigInteger>(objectIds);
    for(BigInteger objId : allObjectIds) {
        SomeObject obj = getObjectById(objId); // obj.getColour(): red, green or blue
        if(isFirstGroup(obj)) { // the first group
            createInFirstGroup(obj);
        } else { // the second group
            createInSecondGroup(obj);
        }
    }    
}
公共作废方法(集合对象){
集合AllObjectId=新哈希集(ObjectId);
for(BigInteger对象:AllObjectId){
SomeObject obj=getObjectById(objId);//obj.getcolor():红色、绿色或蓝色
if(isFirstGroup(obj)){//第一组
createInFirstGroup(obj);
}else{//第二组
创建一个组(obj);
}
}    
}
它将获得大量的
allobjectid
作为输入。为了获得更好的性能,需要同时执行
createInFirstGroup
createInSecondGroup
,同时考虑以下条件:

  • 所有
    SomeObject
    类型的对象都可以分为两组-第一组和第二组。所有传入对象都可以来自第一组、第二组或两者
  • SomeObject
    类有一个字段
    color
    ,它可以等于“红色”、“绿色”、“蓝色”。具有不同ID的对象可以具有相同的颜色值。因此,这些具有相同颜色值的对象可以位于每个组内(第一组、第二组或两组)。在组和颜色相同的情况下,
    createInFirstGroup
    createInSecondGroup
    方法中的处理不应同时进行 例如,以下组合是错误的(x,y对):

    • 螺纹x、y:(第一组,绿色;第一组,绿色)
    • 螺纹x,y:(第二组,绿色;第二组,绿色)
    以下组合是正确的:

    • 螺纹x、y:(第一组,绿色;第二组,绿色)
    • 螺纹x、y:(第一组,绿色;第一组,红色)
    将所描述的
    public void方法(Collection objectid)
    方法(其for循环部分)移植到并发中,提供最佳线程数量和任务分布的正确方法(可能有一些合适的模式)是什么(考虑到所描述的条件)


    提前谢谢你

    我不太清楚您的限制,但一种通用方法是通过队列连接管道。您可以使用阻塞队列来施加背压。以下是受“actor”启发的,每个actor都是单线程的,从阻塞队列接收数据并发布到输出队列,但源和接收器除外。您可以根据这一点实现整个管道,其中源和接收器之间将进行协调,以便接收器知道何时完成

    • 源->收集对象并将其写入队列->中
    • 输出队列
    • 写入输出