私は最近、java.util.concurrent をいじり始めました。誰かが私のコードの欠陥や悪い習慣を指摘してくれたら幸いです。
プログラムはタイムアウトになるまで実行され、完了したすべてのタスクを出力します。
- この場合、ArrayList を使用する必要がありますか?
- おそらくよりスレッドセーフな、このタスクに適したクラスはありますか。
- 建設的な批判は役に立ちます。
メインクラス
public class ConcurrentPackageTests {
private final ExecutorService executor;
public ConcurrentPackageTests() {
executor = Executors.newFixedThreadPool(2);
this.testCallable(4);
}
private void testCallable(int nInstances) {
long startTime = System.currentTimeMillis();
List<Future<Integer>> futures = null;
List<Integer> results = null;
ArrayList<exCallable> callables = new ArrayList<exCallable>(nInstances);
for (int id = 0; id < nInstances; id++) {callables.add(id, new exCallable(id,5));}
//get a list of the futures, monitor the futures outcome.
try { futures = executor.invokeAll(callables, 5, TimeUnit.SECONDS);}
catch (Exception e) { System.out.println("TIMED OUT");}
executor.shutdown(); //Stop accepting tasks.
System.out.println();
results = getFValues(futures); //gets all completed tasks
printOutValues(results, startTime);
}
/**
* get all integer values that terminated successfully.
* @param e
* @return Integer List of results
*/
private List<Integer> getFValues(List<Future<Integer>> e){
final ArrayList<Integer> list = new ArrayList<Integer>(e.size());
for (Future<Integer> f : e) {
if(!f.isCancelled()){
try { list.add(f.get(1, TimeUnit.SECONDS));}
catch (Exception e1) { System.out.println("Err");}
}
}
list.trimToSize();
return list;
}
private void printOutValues(List<Integer> results, long startTime){
for (Integer integer : results) {
System.out.println("Result: " + integer);
} System.out.println("Time: "+ ( System.currentTimeMillis() - startTime ));
}
呼び出し可能
public class exCallable implements Callable<Integer>{
private int n;
int result = 1;
final int ID;
public int getResult() {
return result;
}
public exCallable(int ID, int pN) {
this.ID = ID;
this.n = new Random().nextInt(pN)+ 1;
}
@Override
public Integer call() throws Exception{
for (int i = 0; i < n; i++) {
result *= 2;
Thread.sleep(500); //Simulate work.
}
System.out.println("Computation<" + ID + ">2^"+n+"="+result);
return result;
}
}