首页
学习
活动
专区
圈层
工具
发布

Java 中的线程池简介-Java快速进阶教程

; // some operations String result = future.get();Copy 当然,在现实生活中,我们通常不想立即调用future.get(),而是推迟调用它,直到我们真正需要计算的值...为了将相同的删除策略应用于核心线程,我们可以使用allowCoreThreadTimeOut(true) 方法。 这些参数涵盖了广泛的用例,但最典型的配置是在执行程序静态方法中预定义的。...但是当不再需要线程时,它们将在 60 秒不活动后被处理掉。一个典型的用例是当我们的应用程序中有很多短期任务时。 队列大小将始终为零,因为内部使用了同步队列实例。...());Copy directExecutor() 方法返回的实例实际上是一个静态单例,因此使用此方法根本不会在对象创建时提供任何开销。...退出Executor Services 另一个常见问题是在线程池仍在运行其任务时关闭虚拟机。即使有取消机制,也不能保证任务在执行程序服务关闭时会表现良好并停止工作。

36110

Java并发编程的艺术(七)——Executors

因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逸出。...当将一个Callable的对象传递给ExecutorService的submit方法,则该call方法自动在一个线程上执行,并且会返回执行结果Future对象。...同样,将Runnable的对象传递给ExecutorService的submit方法,则该run方法自动在一个线程上执行,并且会返回执行结果Future对象,但是在该Future对象上调用get方法,将返回...Executor执行Runnable任务 通过Executors的以上四个静态工厂方法获得 ExecutorService实例,而后调用该实例的execute(Runnable command)方法即可...函数返回值为String类型; 如果Future的返回尚未完成,则get()方法会阻塞等待,直到Future完成返回,可以通过调用isDone()方法判断Future是否完成了返回。

99550
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    3分钟带你搞懂 Future 玩法

    如果看过ExecutorService.submit()方法,会发现它的返回参数都是Future类型,Future类型的实例可以用来获取异步任务执行的结果。...Future的实例 Future future = executor.submit(task); // 从Future获取异步执行返回的结果(可能会阻塞等待结果...xxx.png 从以上的示例可以清晰的看到,当需要获取异步线程的执行结果返回值时,通常需要搭配使用Future和Callable接口来实现,大体可以用如下步骤来概括: 1.首先提交一个实现Callable...接口的任务到线程池中 2.然后获取一个Future类型的对象 3.最后在主线程中调用Future对象的get()方法,如果异步任务执行完成,就可以直接获得结果;如果异步任务执行没有完成,get()方法会阻塞...其它常用实现类简介: CompletableFuture:支持传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法 ForkJoinTask:支持把一个大任务拆成多个小任务,然后并行执行

    42510

    聊聊 Future 接口

    如果看过ExecutorService.submit()方法,会发现它的返回参数都是Future类型,Future类型的实例可以用来获取异步任务执行的结果。...Future的实例 Future future = executor.submit(task); // 从Future获取异步执行返回的结果(可能会阻塞等待结果...xxx.png 从以上的示例可以清晰的看到,当需要获取异步线程的执行结果返回值时,通常需要搭配使用Future和Callable接口来实现,大体可以用如下步骤来概括: 1.首先提交一个实现Callable...接口的任务到线程池中 2.然后获取一个Future类型的对象 3.最后在主线程中调用Future对象的get()方法,如果异步任务执行完成,就可以直接获得结果;如果异步任务执行没有完成,get()方法会阻塞...其它常用实现类简介: CompletableFuture:支持传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法 ForkJoinTask:支持把一个大任务拆成多个小任务,然后并行执行

    10510

    python并发之concurrent快速入门

    另外,与Executor同在_base.py模块中定义的还有future类(调度并发任务后生成对象,用于获取单个任务信息)、wait()方法(其功能类似利用threading模块实现多线程时的join方法...arg in args]#方式1 results = executor.map(fun, args)#方式2 获取多线程调用结果 在使用submit执行多线程任务时,每个线程任务返回一个future...对象,future对象是一个用于接收单个任务执行结果的对象,其result()方法常用于获取单任务执行结果,例如 futures = [executor.submit(fun, arg) for arg...submit与map对比:二者均可用于执行线程池任务并返回结果,区别是后者直接返回执行结果;而前者返回一个future对象,在future对象中,除了可用其result()方法获得执行结果外,还有详细的方法来获取和设置任务状态...下面通过两个实例验证这一结论,并测试并发效率 IO密集型 我们以python爬虫请求10次网页为例,分别测试串行、多线程和多进程3种方式的执行时间 from concurrent.futures import

    4K30

    java并发编程实战_java解决并发问题

    ,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。...:是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,返回 Future 对象,以及可跟踪一个或多个异步任务执行状况返回Future的方法;可以调用ExecutorService的...因此我们一般用该接口来实现和管理多线程。 通过 ExecutorService.submit() 方法返回的 Future 对象,可以调用isDone()方法查询Future是否已经完成。...当任务完成时,它具有一个结果,你可以调用get()方法来获取该结果。...总结起来,也即是说,当有新的任务要处理时,先看线程池中的线程数量是否大于corePoolSize,再看缓冲队列workQueue是否满,最后看线程池中的线程数量是否大于maximumPoolSize。

    1K20

    ExecutorService使用指南-Java快速入门教程

    例如,以下代码行将创建一个包含 10 个线程的线程池: ExecutorService executor = Executors.newFixedThreadPool(10);Copy 还有其他几种工厂方法可以创建满足特定用例的预定义执行器服务...将可调用或可运行的任务提交给ExecutorService,并返回Future 类型的结果: Future future = executorService.submit(callableTask...在某些情况下,这非常有用,例如当应用需要处理不规则出现的任务或在编译时任务数量未知时。 另一方面,应用程序可以到达其终点,但不会停止,因为等待的执行器服务将导致 JVM 继续运行。...5.Future接口 submit() 和invokeAll() 方法返回一个对象或Future 类型的对象集合,这允许我们获取任务执行的结果或检查任务的状态(它是否正在运行)。...让我们总结一下: 使未使用的执行程序服务保持活动状态:请参阅第 4 节中有关如何关闭执行程序服务的详细说明。 使用固定长度线程池时线程池容量错误:确定应用程序需要多少线程才能高效运行任务非常重要。

    34400

    【Java】多线程初探

    对象可帮助它保存结果信息,当调用get方法的时候将会发生阻塞, 直到结果被返回。...这样一来,可以先把得到的task传入Thread构造函数中创建线程并运行(作为Runnable使用), 接着通过task.get以阻塞的方式获得返回值(作为Future使用) 下面是一个示范例子: MyCallable.java...(task);     t.start();     // 作为Future使用, 调用get方法时将阻塞直到获得返回值     System.out.println(task.get());   }...实例提交给线程池里的空闲线程执行,同时返回一个Future对象, 保存了和执行结果有关的信息 当线程池用完时, 需要调用 shutdown方法关闭线程 Executors类 (注意Executor是接口...调用Executors类中的工厂方法,如newFixedThreadPool获得线程池(执行器)实例 2. 调用submit方法提交Runnable对象或Callable对象 3.

    86140

    executorservice实例_java controller

    比如 ExecutorService executor = Executors.newFixedThreadPool(10); 当然还有其它很多工厂方法,每种工厂方法都可以创建满足特定用例的预定义 ExecutorService...因此使用该方法没有任何可能获得任务执行结果或检查任务的状态( 是正在运行 ( running ) 还是执行完毕 ( executed ) )。...接口 submit() 方法和 invokeAll() 方法返回一个 Future 接口的对象或 Future 类型的对象集合。...因为 get() 方法是阻塞的。如果调用 get() 方法时任务仍在运行,那么调用将会一直被执阻塞,直到任务正确执行完毕并且结果可用时才返回。...在取消任务后调用 Future 的 get() 方法 尝试获取已取消任务的结果将触发 CancellationException 异常。

    64620

    高并发之——P8级别架构师带你深度解析线程池中那些重要的顶层接口和抽象类

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。...List shutdownNow(); //判断线程池是否已经关闭 boolean isShutdown(); //判断线程池中的所有任务是否结束,只有在调用...,检测任务是否完成,如果没有完成,则调用get方法阻塞任务,直到返回结果数据,此时会忽略异常。... ftask = newTaskFor(task); execute(ftask); return ftask; } 从源码中可以看出submit方法提交任务时,本质上还是调用的...综上所述,在非定时任务类的线程池中提交任务时,本质上都是调用的Executor接口的execute方法。至于调用的是哪个具体实现类的execute方法,我们在后面的文章中深入分析。

    62910

    Java的Executor框架和线程池实现原理

    ():(可缓存线程池)ExecutorService 创建一个线程池,按需创建新线程,就是有任务时才创建,空闲线程保存60s,当前面创建的线程可用时,则重用它们 +new SingleThreadExecutor...必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果 在Future接口中声明了5个方法,下面依次解释每个方法的作用: +cancel方法用来取消任务,如果取消任务成功则返回true...(); } 不直接构造Future对象,也可以使用ExecutorService.submit方法来获得Future对象,submit方法即支持以 Callable接口类型,也支持Runnable...(); } 使用submit 方法来提交任务,它会返回一个Future对象,通过future的get方法来获取返回值,get方法会阻塞住直到任务完成,而使用get(long timeout...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    63420

    java线程池executorservice是否结束_java线程池怎么使用

    如果我们想获得task的执行结果,我们可以传入一个Callable的实例(下面会介绍)。...4.2 submit(Runnable) submit(Runnable)和execute(Runnable)区别是前者可以返回一个Future对象,通过返回的Future对象,我们可以检查提交的任务是否执行完毕...4.3 submit(Callable) submit(Callable)和submit(Runnable)类似,也会返回一个Future对象,但是除此之外,submit(Callable)接收的是一个...("future.get = " + future.get()); } executorService.shutdown(); 五、ExecutorService的关闭 当我们使用完成ExecutorService...在调用shutdown()方法之后,ExecutorService不会立即关闭,但是它不再接收新的任务,直到当前所有线程执行完成才会关闭,所有在shutdown()执行之前提交的任务都会被执行。

    1.4K30

    ExecutorService 并发指南

    当调用submit时,ExecutorService 安排任务执行并返回一个Future对象。 execute(Runnable task): 这个方法接受一个Runnable对象作为输入。...Future的力量:管理任务执行 当我们使用submit(Callable task)时,ExecutorService 返回一个Future对象。这个Future对象作为任务最终结果的占位符。...它提供了几种管理任务执行的方法: get(): 这个方法阻塞调用线程,直到任务完成执行,然后返回Callable中的call()方法产生的结果。 isDone(): 这个方法检查任务是否已完成执行。...让我们通过一些代码示例来探索一些常见用例: 网络请求 当需要从多个API并发地获取数据以提升Web应用程序的感知性能时,ExecutorService 可以发挥重要作用。...线程饥饿: 在使用缓存线程池时,频繁的短暂任务可能导致线程池不断创建和销毁线程。这种行为会消耗大量资源,并可能使长期运行的任务无法获得足够的 CPU 时间。

    59210

    我靠(call) ,我的未来(Future)在哪里???

    这一套操作在代码实现上似乎也并不难,可是对于call()方法具体怎么(被ExecutorService)执行的,以及 Future 这个结果是怎么获取的,却又不是很清楚了。...以第一个 Future submit(Callable task);为例,其中 task 为用户定义的执行的异步任务,Future 表示了任务的执行结果,泛型 T 代表任务结果的类型。...注意 outcome 的注释,无论是否发生异常返回的都是这个 outcome,因为在执行中如果执行成功就将结果设置给了它(set()),而发生异常时将异常赋给了他(setException()),而在获取结果时也都返回了...下面通过一个例子看看他们在使用上的区别。 首先创建一个任务,即定义一个任务类实现 Callable 接口,在 call() 方法里添加我们的操作,这里用耗时三秒然后返回 100 模拟计算过程。..."+futureTask.get()); // 作为Future获取结果 executor.shutdown(); 这段程序的输出与上面中完全相同,其实两者在实际执行中的区别也不大,虽然前者调用了

    77910

    JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask

    为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作,但是它不能返回一个值...Future result = executor.submit(task);这行代码就是构造一个Future。使用其get()方法就能得到最后的运行值。  ...当canel方法起作用时,有两个情况: 1.任务未开始,则该任务将永远不会运行; 2.任务处于执行状态,paramBoolean表示是否采用中断的方式中断线程。...(); // 3.使用submit方法将任务提交(返回的是一个Future) Future result = executor.submit(task)...); // 3.使用submit方法将任务提交(返回的是一个Future) Future result = executor.submit(task);

    1.1K50

    实战分析Java的异步编程,并通过CompletableFuture进行高效调优

    一、写在开头在我们一开始讲多线程的时候,提到过异步与同步的概念,这里面我们再回顾一下:同步:调用方在调用某个方法后,等待被调用方返回结果;调用方在取得被调用方的返回值后,再继续运行。...异步:当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就可以使用异步,提高效率、加快程序的响应。而我们今天探讨的话题就是Java中的异步编程。..., ExecutionException, TimeoutExceptio}这些接口大致提供的服务是:我有一个任务分配给了Future,然后我可以继续去干其他的事情,然后我可以在这个过程中去看任务是否完成...Future 类型的对象,通过这个 Future 对象可以判断任务是否执行成功,并且可以通过 Future 的 get()方法来获取返回值。...五、总结好了,今天就讲这么多,其实在Java中通过条用CompletableFuture实现异步编排的工作还是稍微有点难度的,大量的API支持,需要我们在一次次的实战中去熟悉,并灵活使用。

    49110

    corejava辅导(17--3)

    传入的参数标明是否可打断线程,true表明可以打断。 *6: 任务3抛出异常,调用future3.get()时会引起异常的抛出。  运行Executor会有以下运行结果: looping.......: 任务2是个死循环,这是它的打印结果 *3: 指示任务2被取消 *4: 在执行future3.get()时得到任务3抛出的异常 lock接口 实现类ReentrantLock 我们可以用lock对象...,来对临界资源加锁调用lock对象的lock()方法,使得没有得到锁的线程阻塞,解锁则调用lock对象的unlock()方法,并且释放锁,只有获得lock对象才能访问临界资源,如果没有获得lock对象,...notify(),notifyAll() 在JDK5.0中已经用Condition实现类的signal() ,signalAll()方法替换掉了,在JDK5.0中,可以使用多个等待队来存放等待的线程,并对线程进行分类...Exchanger类,用exchange()方法可以使两个线程间相互交换对象,在两线程的同步点,等待第二个线程。在同步点时,交换对象,并同时被释放。

    13110

    21.3 Java 线程池

    线程是在一个进程中可以执行一系列指令的执行环境,或称运行程序。多线程编程指的是用多个线程并行执行多个任务。当然,JVM 对多线程有良好的支持。...():包含固定数量线程并共享无界队列的线程池;当所有线程处于工作状态,有新任务提交时,任务在队列中等待,直到一个线程变为可用状态 newCachedThreadPool():只有需要时创建新线程的线程池...因为 Future 只是一个接口,所以是无法直接用来创建对象使用的,因此就有了下面的 FutureTask。...、以及处理过程中的异常都被包装到 Future 中,并在调用 Future.get() 方法时获取,执行过程中的异常会被包装成 ExecutionException,submit() 方法本身不会传递结果和任务执行过程中的异常...获取多个结果 如果向线程池提交了多个任务,要获取这些任务的执行结果,可以依次调用Future.get()获得。

    51720

    一篇文章梳理清楚 Python 多线程与多进程

    有了fork调用,一个进程在接到新任务时就可以复制出一个子进程来处理新任务,常见的Apache服务器就是由父进程监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求。...管理器是独立运行的子进程,其中存在真实的对象,并以服务器的形式运行,其他进程通过使用代理访问共享对象,这些代理作为客户端运行。...,并在该子进程中启动管理器服务器 get_server():获取服务器对象 connect():连接管理器对象 shutdown():关闭管理器对象,只能在调用了start()方法之后调用 实例属性:...submit()方法 Executor中定义了submit()方法,这个方法的作用是提交一个可执行的回调task,并返回一个future实例。future对象代表的就是给定的调用。...Future类封装了可调用的异步执行。Future 实例通过 Executor.submit()方法创建。 cancel():试图取消调用。

    2.4K10
    领券