ag真人百家乐 229622点co
最近恰是找实习的大好时机,互联网各家也远离官宣了他们的招聘计算。
京*告示要招聘 10000 东谈主,腾*告示要招聘 7000 东谈主,字节**告示要招 4000 东谈主,好意思*告示了他们要招聘 5000 东谈主,况且公布了 70% 的高转正率:
这不,这两天有同学口试好意思团,被拷打了 1 个多小时,其中有一谈问题印象长远:若何断绝多线程任务编排?
接下来我们就具体聊聊这个问题。
界说
线程编排界说:多线程任务编排指的是对多个线程任务按照一定的逻辑端正或条目进行组织和安排,以断绝协同使命、端正施行或并行施行的一种机制。
如下图所示,其中任务二需要等任务一施行完成之后再施行,而任务四要等任务二和任务三施行完成之后再施行,这个时辰就需要任务编排机制来保证任务的施行端正:
断绝神志
线程的任务编排的断绝神志主要有以下两种:
FutureTask:出身于 JDK 1.5,它断绝了 Future 接口和 Runnable 接口,瞎想初志是为了复旧可取消的异步揣度。它既不错承载 Runnable 任务(通过包装成 RunnableAdapter),也不错承载 Callable 任务,从而省略复返揣度铁心,使用它不错断绝节略的异步任求施行和铁心的恭候。
CompletableFuture:出身于 JDK 8,它不仅断绝了 Future 接口,还断绝了 CompletionStage 接口。CompletionStage 是对 Future 的彭胀,提供了丰富的链式异步编程模子,复旧函数式编程作风,不错愈加天真地解决异步操作的组合和依赖回调等。
FutureTask 使用案例
FutureTask 使用示举例下:
import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class FutureTaskDemo { public static void main(String[] args) { // 创建一个Callable任务 Callable task = -> { Thread.sleep(2000); // 模拟任务耗时操作 return 10; // 复返任务铁心 }; // 创建FutureTask,并将Callable任务包装起来 FutureTask futureTask = new FutureTask(task); // 创建线程池 ExecutorService executor = Executors.newCachedThreadPool; // 提交FutureTask给线程池施行 executor.submit(futureTask); try { // 取得任务铁心,Ag百家乐时间差get举止会郁闷直到任务完成并复返铁心 int result = futureTask.get; System.out.println("任务铁心:" + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace; } }}
在上述示例中,通过创建一个 Callable 任务来模拟耗时操作,并使用 FutureTask 包装该任务。然后将 FutureTask 提交给线程池施行,终末通过 get 举止取得任务的施行铁心,之后才会施行后续经过。我们不错通过 get 举止郁闷恭候举止施行铁心,从而完成线程任务的节略编排。
CompletableFuture 使用案例
从上头 FutureTask 断绝代码不错看出,它不但写法可贵,而且需要使用 get 举止郁闷恭候线程的施行铁心,关于异步任务的施行来说,不够天真且后果也会受影响,然而 CompletableFutrue 的出现,则弥补了 FutureTask 的这些瑕玷。
CompletableFutrue 提供的举止有好多,但最常用和最实用的中枢举止只好以下几个:
举例,我们当今断绝一个这么的场景:
任务描述:任务一施行完之后施行任务二,任务三和任务一和任务二一齐施行,通盘任务王人有复返值,等任务二和任务三施行完成之后,再施行任务四,它的断绝代码如下:
import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;public class CompletableFutureExample { public static void main(String[] args) { // 任务一:复返 "Task 1 result" CompletableFuture task1 = CompletableFuture.supplyAsync( -> { try { // 模拟耗时操作 Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread.interrupt; throw new RuntimeException(e); } return "Task 1 result"; }); // 任务二:依赖任务一,复返 "Task 2 result" + 任务一的铁心 CompletableFuture task2 = task1.handle((result1, throwable) -> { try { // 模拟耗时操作 Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread.interrupt; throw new RuntimeException(e); } return "Task 2 result " + result1; }); // 任务三:和任务一、任务二并行施行,复返 "Task 3 result" CompletableFuture task3 = CompletableFuture.supplyAsync( -> { try { // 模拟耗时操作 Thread.sleep(800); // 任务三可能比任务二先完成 } catch (InterruptedException e) { Thread.currentThread.interrupt; throw new RuntimeException(e); } return "Task 3 result"; }); // 任务四:依赖任务二和任务三,恭候它们王人完成后施行,复返 "Task 4 result" + 任务二和任务三的铁心 CompletableFuture task4 = CompletableFuture.allOf(task2, task3).handle((res, throwable) -> { try { // 这里不需要显式恭候,因为 allOf 也曾保证了它们完成 return "Task 4 result with " + task2.get + " and " + task3.get; } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } }); // 取得任务四的铁心并打印 String finalResult = task4.join; System.out.println(finalResult); }}
课后想考
CompletableFuture 底层断绝旨趣是啥?CompletableFuture 需要相助线程池一齐使用吗?为什么?ag真人百家乐 229622点co