私は並列プロセスを実行するためにマルチスレッドを実現するために以下のようなプログラムを使用しましたが、完全に、私は5つのファイルをスレッドごとのデータと並行して書きますが、5つのうち4つのファイルが唯一の書き込みです。ExecutorServiceを使用する - 一部のプロセスで呼び出しメソッドが早期にタイムアウトしています
private static final Random PRNG = new Random();
private static class Result {
private final int wait;
public Result(int code) {
this.wait = code;
}
}
public static Result compute(Object obj) throws InterruptedException {
int wait = PRNG.nextInt(3000);
Thread.sleep(wait);
return new Result(wait);
}
public static void main(String[] args) throws InterruptedException, ExecutionException
{
List<Object> objects = new ArrayList<Object>();
for (int i = 0; i < 1000; i++) {
objects.add(new Object());
}
List<Callable<Result>> tasks = new ArrayList<Callable<Result>>();
for (final Object object : objects) {
Callable<Result> c = new Callable<Result>() {
@Override
public Result call() throws Exception {
return compute(object);
}
};
tasks.add(c);
}
ExecutorService exec = Executors.newCachedThreadPool();
// some other exectuors you could try to see the different behaviours
// ExecutorService exec = Executors.newFixedThreadPool(3);
// ExecutorService exec = Executors.newSingleThreadExecutor();
try {
long start = System.currentTimeMillis();
List<Future<Result>> results = exec.invokeAll(tasks);
int sum = 0;
for (Future<Result> fr : results) {
sum += fr.get().wait;
System.out.println(String.format("Task waited %d ms",
fr.get().wait));
}
long elapsed = System.currentTimeMillis() - start;
System.out.println(String.format("Elapsed time: %d ms", elapsed));
System.out.println(String.format("... but compute tasks waited for total of %d ms; speed-up of %.2fx", sum, sum/(elapsed * 1d)));
} finally {
exec.shutdown();
}
}
は、私たちは、プロセスがスレッドを完了すると達成するためにマルチスレッドのために何ができる任意のより良い解決策は、プロセスから終了する必要があります知っているかもしれないと私はJava8、
を使用しています、私は参照して同じコードを参照してください。更新処理コード、
public String compute(String obj) throws InterruptedException {
MyProcess myProc=new MyProcess(writeFiles(obj));
myProc.generateReport();
}
public void processMethod() {
List<Callable<String>> tasks = new ArrayList<Callable<String>>();
for (final String object : list) {
Callable<String> c = new Callable<String>() {
@Override
public String call() throws Exception {
return compute(object);
}
};
tasks.add(c);
}
ExecutorService exec = Executors.newCachedThreadPool();
try {
long start = System.currentTimeMillis();
List<Future<String>> results = exec.invokeAll(tasks);
String sum=null;
}
finally {
exec.shutdown();
}
try {
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
}
}
がwriteFilesはすべて1回、この場合には、読み取りおよび書き込みデータをデータベースからローカルファイルにメモリに巨大であるとの違いが含まれている5つのファイルを比較する必要があります考えてみましょうファイルは書き込まれ、fo r他のものは1つのファイルしか書き込まれず、スレッドの合計時間がすべてのプールスレッドに共有されており、時間内にすべてのファイルを書き込むことはできません。
@ holi-java正解。 'Thread.sleep'は指定された時間だけスリープ状態になることは保証されていませんが、少なくとも*その時間以上はスリープ状態になることが保証されていないため、さらに矛盾が生じました。 – Michael
しかし、 'sleep()'も中断する可能性があります... –
実際の問題が何であるかを理解するのは難しいです。私は、「スレッドが別のスレッドに移動している」、または「プロセスが完全に完了していない」ということはわかりません。特にいくつかの数値を実行して印刷するサンプルプログラムでは特にそうです。どのような数字が得られ、代わりにどの数字が期待されますか?これらの数字と「スレッドが別のスレッドに移動しています」または「プロセスを完全に完了していません」という関係は何ですか? – Holger