我已经使用了一个类似的程序,如下所示,以实现多线程来运行并行进程,但在完成一些进程之前,我的线程正在移动到另一个(或)它没有完成进程完全地,我写了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 objects = new ArrayList();
for (int i = 0; i < 1000; i++) {
objects.add(new Object());
}
List> tasks = new ArrayList>();
for (final Object object : objects) {
Callable c = new Callable() {
@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> results = exec.invokeAll(tasks);
int sum = 0;
for (Future 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> tasks = new ArrayList>();
for (final String object : list) {
Callable c = new Callable() {
@Override
public String call() throws Exception {
return compute(object);
}
};
tasks.add(c);
}
ExecutorService exec = Executors.newCachedThreadPool();
try {
long start = System.currentTimeMillis();
List> results = exec.invokeAll(tasks);
String sum=null;
}
finally {
exec.shutdown();
}
try {
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
}
}
考虑writeFiles将读取并从数据库到本地文件写入数据是内存巨大,需要在5个文件,其中包含差异,其中在这种情况下,一周时间所有的比较该文件正在写入和fo其他人只有一个文件正在写入,并且线程的总时间将被分配给所有池线程,并且在持续时间内不可能写入所有文件。
+0
@ holi-java正确。引入了一个更进一步的差异,因为'Thread.sleep'不能保证在给定的时间内睡眠,但*至少*这段时间 - 可能会更长。 –
+1
但是sleep()也可能被中断... –
+1
我很难理解你真正的问题是什么。也就是说,我不知道“我的线程正在转移到另一个线程”或“没有完全完成这个过程”的意思。特别是使用您的示例程序,它将简单地运行并打印一些数字。你会得到什么数字,你期望得到什么数字?这些数字与“我的线索正在转移到另一个”或“没有完全完成这个过程”之间的关系是什么? –