ShutdownOnFailure
执行多个任务,只要有一个失败(发生异常或引发其他活动异常),就停止其他未完成的任务,并使用scope.throwIfFailed来捕获并抛出异常 。
如果所有任务都正常,可以使用Feture.get()或*Feture.resultNow()来获取结果 。
public static void main(String[] args) throws IOException {try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {Future<String> res1 = scope.fork(() -> runTaskWithException(1));Future<String> res2 = scope.fork(() -> runTaskWithException(2));Future<String> res3 = scope.fork(() -> runTaskWithException(3));scope.join();scope.throwIfFailed(Exception::new);String s = res1.resultNow();System.out.println(s);String result = Stream.of(res1, res2, res3).map(Future::resultNow).collect(Collectors.joining());System.out.println("result:" + result);} catch (Exception e) {e.printStackTrace();}}public static String runTaskWithException(int i) throws InterruptedException {Thread.sleep(1000);long l = new Random().nextLong(3);if (l == 0) {throw new InterruptedException();}String s = String.valueOf(l);System.out.println(i + "task:" + s);return s;}
3. 作用域值我们一定使用过ThreadLocal,它是线程本地变量,只要线程不销毁,就可以随时获取ThreadLocal中的变量值 。作用域值也可以在线程内的任何时候获取变量,但它有一个作用域的概念,当超出作用域时将被销毁 。
public class ScopedValueExample {final static ScopedValue<String> LoginUser = ScopedValue.newInstance();public static void main(String[] args) throws InterruptedException {ScopedValue.where(LoginUser, "Tom").run(() -> {new Service().login();});Thread.sleep(2000);}static class Service {void login() {System.out.println("user:" + LoginUser.get());}}}
上面的示例模拟了用户登录过程,使用ScopedValue.newInstance()声明了一个ScopedValue,使用ScopedValue.where为ScopedValue设置了一个值,并使用run方法执行接下来要做的事情,以便在run()内部随时获取ScopedValue 。在run方法中模拟了service的登录方法,不需要传递参数LoginUser,直接通过LoginUser.get方法可以直接获取当前登录用户的值 。
推荐阅读
- 理解JAVA的垃圾回收机制
- 香港虚拟币案波及娱乐圈,张智霖曾是代言人,TVB艺人自曝亏50万
- 虚拟现实技术:让你沉浸式体验全新世界
- 虚拟现实:颠覆传统娱乐方式的未来技术
- 一步步进入虚拟现实:AI是如何创造沉浸式艺术的
- 增强现实:扩增的真实
- 针对高级前端的八个级JavaScript面试问题
- 利用Linux虚拟化技术实现资源隔离和管理
- 虚拟现实技术应用架构:拓展互联网体验
- 很多主流项目都放弃了Java 8,背后的原因是什么