
先从线程池开始聊起
声明一个线程池,这个没问题,前面说过,用static也行,用spring来托管也可以
2个方法:execute和submit
任务 | 参数 | 异常 | 返回值 | |
|---|---|---|---|---|
execute | 提交不需要返回结果的任务 | 实现Runnable接口 | RuntimeException或Error都传给调用者 | 无返回值 |
submit | 提交需要返回值或处理异常的任务 | 无需返回值用Runnable接口,需返回值用Callable接口 | ExecutionException,用Future.get()获取 | 返回Future对象 |
来看代码实现吧
// Runnable 任务
executor.execute(() -> {
System.out.println("executed by " + Thread.currentThread().getName());
});
// Callable 任务
Future<String> future = executor.submit(() -> {
TimeUnit.SECONDS.sleep(1);
return "Callable task result";
});
try {
String result = future.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} Lambda匿名类
上面的是Java8的Lambda表达式-匿名类,() -> { ... }
业务上会用函数,直接写到submit里面去。
设置超时时间
try {
// 尝试在2秒内获取任务结果
String result = future.get(2, TimeUnit.SECONDS);
System.out.println("Task completed with result: " + result);
} catch (TimeoutException e) {
// 任务在超时时间内没有完成
System.err.println("Task timed out!");
future.cancel(true); // true表示如果任务正在运行则中断它
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executorService.shutdown();
} CompletableFuture<String> future = CompletableFuture.supplyAsync(
() -> {
TimeUnit.SECONDS.sleep(1);
return "CompletableFuture task";
},
executor // 指定使用自定义的 ThreadPoolExecutor
);
// 处理异步任务的结果
future.thenAccept(result -> {
System.out.println(" result: " + result);
}).exceptionally(ex -> {
System.err.println(" failed: " + ex.getMessage());
return null; // 异常处理
}); 设置超时时间
public void process() {
Future<String> future = executor.submit(() -> {
return "submit ok";
});
try {
future.get(1, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。