这种方法的Java博士说
如果需要,最多等待给定的时间完成计算,然后检索其结果(如果可用)。
参数:
超时等待的最长时间
unit超时参数的时间单位
根据我的理解,我们对调用
强加了一个超时,我们提交给ExecutorService
,这样,我的调用
将在指定的时间(超时)过去后中断
但是根据下面的代码,longMethod()
似乎超过了超时时间(2秒),我真的很难理解这一点。谁能给我指一下正确的路吗?
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Timeout implements Callable<String> {
public void longMethod() {
for(int i=0; i< Integer.MAX_VALUE; i++) {
System.out.println("a");
}
}
@Override
public String call() throws Exception {
longMethod();
return "done";
}
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
try {
service.submit(new Timeout()).get(2, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的可调用将在指定时间(超时)过去后中断
上面的语句是错误的,通常Future.get是阻塞的。指定超时允许您以非阻塞方式使用它。
例如,在时间关键型应用程序中,如果您需要在2秒内得到结果,并且在2秒内收到结果意味着您无法使用该结果。
get()上的超时是“客户端”等待将来完成的时间。它不会对未来的执行产生影响。
Object result;
int seconds = 0;
while ((result = fut.get.(1, TimeUnit.SECOND)) == null) {
seconds++;
System.out.println("Waited " + seconds + " seconds for future";
}
我的可调用将在指定时间(超时)过去后中断
不是真的。该任务将继续执行,而在超时后将有一个空字符串。
如果要取消它:
timeout.cancel(true) //Timeout timeout = new Timeout();
P. S.正如你现在所拥有的,这个中断不会有任何影响。你没有以任何方式检查它。
例如,这段代码考虑到中断:
private static final class MyCallable implements Callable<String>{
@Override
public String call() throws Exception {
StringBuilder builder = new StringBuilder();
try{
for(int i=0;i<Integer.MAX_VALUE;++i){
builder.append("a");
Thread.sleep(100);
}
}catch(InterruptedException e){
System.out.println("Thread was interrupted");
}
return builder.toString();
}
}
然后呢:
ExecutorService service = Executors.newFixedThreadPool(1);
MyCallable myCallable = new MyCallable();
Future<String> futureResult = service.submit(myCallable);
String result = null;
try{
result = futureResult.get(1000, TimeUnit.MILLISECONDS);
}catch(TimeoutException e){
System.out.println("No response after one second");
futureResult.cancel(true);
}
service.shutdown();
想象一个超标量(多个执行单元)并且还支持超线程(SMT)的CPU(或内核)。 为什么CPU可以真正并行执行的软件线程数通常由它拥有的逻辑内核(即所谓的硬件线程)的数量给出,而不是它拥有的执行单元总数? 如果我的理解是正确的,SMT实际上并没有实现真正的并行执行,它只是通过复制CPU的某些部分(存储架构状态的部分,但不是主要执行资源)来使上下文切换更快/更有效。另一方面,超标量架构允许每个时钟周期真
然后是数据报通道、pipelineFactory和Bootstrap: 在pipelineFactory中,getPipeline()添加自定义处理程序。 就像中所说的:UDP消息的多线程处理 然后我根据这些条目修改了一些代码。现在创建线程池的条件是: 和ExecutionHandler的pipelineFactory: getPipeline()添加处理程序,如所描述的: 但它们不同时处理。me
我有一个数据库结果,每一个调用创建500条记录500条,然后下一个500条,然后下一个 我需要运行一个记录每个不同线程执行特定任务的程序 我举的例子如下 ExecutorService executor=Executors.newFixedThreadPool(10); 我的问题是,在完成当前executer服务之前,it需要获得接下来的500个用户并尝试开始处理,我需要停止该操作,直到处理了前5
我有一个应用程序,允许用户批量向图像添加水印。该应用程序将只使用一个线程,并且一次只能添加一个水印。 我希望用户能够更改一次运行的水印任务[线程]的数量:可能在设置中为[1-5],并且我不能使用固定的ThreadPool,因为它具有固定的池大小。 我研究了如何使用线程池执行器(ThreadPoolExecutor)私有静态线程池执行器(ThreadPoolExecutor)=(ThreadPool
我正在使用线程池执行器更改遗留设计。详情如下:- 遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。 新:-在新设计中,我将线程池替换为执行器服务 我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。 但我的问题是,这样做是否正确,因
我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....