主要采用(简单)
ExecutorService es = Executors.newFixedThreadPool(100);
public class Synchroniz_Task implements Runnable {
public Synchroniz_Task(Callable<E> call) {
c = call;
}
private Callable<E> c;
@Override
public void run() {
Future<E> future = null;
try {
future = es.submit(c);
Result = future.get(4, TimeUnit.SECONDS);
// 处理结果Result
}
catch (TimeoutException e) {
// 提示用户
try {
es.submit(new SynTask(future);
}
catch (Exception e1) {
processTaskException(e);
}
}
catch (Throwable e) {
processTaskException(e);
}
}
}
}
public class SynTask implements Runnable{
Future<E> f
public Task(Future<E> f){
this.f = f;
}
@Override
public void run() {
try {
f.get();
}
catch (Exception e1) {
processTaskException(e);
}
}
}
ExecutorService 取的 Future,然后通过它的get方法指定处理时间。
如果超时会抛出TimeoutException异常,这时可以先给使用者返回。
然后在线程池中,再提交一个任务,调用future的get()方法。
这时主线程可以返回了,等长时间处理的任务有结果放到一个结果处理队列中
这个处理队列可以再新建一个或多个线程作为消费者。
future的get(时间)和get()不会造成任务执行两次。
其内部原理是,启动两个线程,一个时间线程,一个任务线程,那个先完成,get取的就是这个。
取的结果后不影响另外一个执行。所以可以重复取的。
我理解,
定长任务,都是通过一次启动两个线程,然后两个线程看成两个任务。来完成定时返回控制的。