2017-04-10 9 views
1

を使用してサブリストの並列executioのための執行を適用する私は、大きなサイズのリストを実行したいです。あまりにも多くの時間を取る値を取得します。だから、私はサブリストとしてリストを分割し、すべてのリストを並行して実行したい。 私たちはそれに対していくつかの提案をすることができます。分割サブリストへの大規模なリストとJava

例:
従業員クラス:

public class Employee { 

private int eno; 
private String ename; 
private String desg; 

public Employee(int eno, String ename, String desg) { 
    this.eno = eno; 
    this.ename = ename; 
    this.desg = desg; 
} 

public int getEno() { 
    return eno; 
} 

public void setEno(int eno) { 
    this.eno = eno; 
} 

public String getEname() { 
    return ename; 
} 

public void setEname(String ename) { 
    this.ename = ename; 
} 

public String getDesg() { 
    return desg; 
} 

public void setDesg(String desg) { 
    this.desg = desg; 
} 

/* (non-Javadoc) 
* @see java.lang.Object#toString() 
*/ 
@Override 
public String toString() { 
    return "{eno=" + eno + ", ename=" + ename + ", desg=" + desg + "}"; 
    } 
} 

は、クラスの下に使用して従業員を追加します。
は、実際に私は、Webサービスからこれらの値を取得しています。サンプルでは、​​私は従業員のリストと呼ばれ、私はすべてのサブリストの並列実行する各サブリストは100 が含まれているサブリストを作成するクラス

public class EmployeeTest { 

    public List<Employee> getEmployees() { 
    List<Employee> employees = new ArrayList<>(); 
    for (int i = 1; i <= 701; i++) { 
     employees.add(new Employee(i, "s" + i, "sd" + i)); 
    } 
    return employees; 
    } 
} 

の下に作成されました。ここでは、702要素がないので、 java.lang.IndexOutOfBoundsExceptionを取得しています。

public static void main(String[] args) throws InterruptedException { 

    List<Employee> collect = new EmployeeTest().getEmployees().parallelStream().collect(Collectors.toList()); 
    int partitionSize = 100; 
    List<List<Employee>> partitions = new ArrayList<>(); 
    for(int i = 0; i < collect.size();i += partitionSize){ 
     partitions.add(collect.subList(i,i + Math.min(partitionSize, collect.size() - i))); 
    } 

    for (List<Employee> list : partitions) { 
     System.out.println(list.get(1)); 
    } 
} 

どのように私は、このエラーの種類とどのように私は、すべてのリストの並列実行のためにここに執行を実装しなければならないを克服する必要があります。

出力:

{eno=2, ename=s2, desg=sd2} 
    {eno=102, ename=s102, desg=sd102} 
    {eno=202, ename=s202, desg=sd202} 
    {eno=302, ename=s302, desg=sd302} 
    {eno=402, ename=s402, desg=sd402} 
    {eno=502, ename=s502, desg=sd502} 
    {eno=602, ename=s602, desg=sd602} 
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 
at java.util.ArrayList$SubList.rangeCheck(ArrayList.java:1202) 
at java.util.ArrayList$SubList.get(ArrayList.java:1019) 
at com.employee.ExecuteServicesDemo.main(ExecuteServicesDemo.java:22) 

ありがとう!

答えて

0

最後のループにはlist.get(1)という各リストの2番目の要素にアクセスしていますが、これは最後のリストには存在しません(要素は1つだけです)。リストのインデックスは0ベースであることに注意してください。したがって、list.get(0)に変更すると、コードは正常に動作します。また

exec.submit(new Runnable() { 
    @Override 
    public void run() { 
     // process here 
    } 
}); 

:Javaバージョン< 8を使用している場合、あなたは代わりに、ラムダの匿名クラスを使用する必要が

ExecutorService exec = Executors.newFixedThreadPool(parts.size()); 
for (List<Employee> list : partitions) { 
    exec.submit(() -> { // process the list here }); 
} 

:これは、あなたがこのような何かを行うことができ、別のスレッドで示していますプロセスに

submit同時計算の結果を格納する未来を返すことに注意してください、あなたは変数に格納することができます

Future<YourAnyType> res = exec.submit(() -> { 
    // process 
    // return value of YourAnyType 
}); 

この場合には、ラムダがCallable<T>インタフェースの実装であることに注意してください。

関連する問題