`
Cwind
  • 浏览: 265835 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
793bb7df-a2a9-312d-8cb8-b66c3af482d1
LeetCode题解
浏览量:53708
社区版块
存档分类
最新评论

ThreadPoolExecutor使用示例

    博客分类:
  • Java
阅读更多

通常,使用Java开发并发程序时,我们创建Runnable对象,然后创建对应的线程Thead对象来执行它们。Java 5之后,Java并发API提供了Executor框架,主要包括Executor接口,它的子接口ExecutorService,以及实现上述两个接口的ThreadPoolExecutor类。

 

这种机制使得任务的创建和任务的执行分离,使用executor,开发者只需要实现Runnable对象,把对象传递给executor即可。Executor会负责它们的执行、实例化并调度相关的线程。不止于此,通过使用线程池可以改善性能。当向Executor传递任务时,它会尝试使用已池化的线程来执行此任务,避免不断地创建新线程。

本文只介绍一个最基本的threadpoolexecutor的例子,更复杂任务将在后续帖子中介绍。

 

1. 创建待执行的任务

 

class Task implements Runnable 
{
    private String name;
 
    public Task(String name) 
    {
        this.name = name;
    }
     
    public String getName() {
        return name;
    }
 
    @Override
    public void run() 
    {
        try
        {
            Long duration = (long) (Math.random() * 10);
            System.out.println("Doing a task during : " + name);
            TimeUnit.SECONDS.sleep(duration);
        } 
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }
    }
}

 

 2. 使用Executors执行任务

 

现在我们只需要创建一个ThreadPoolExecutor实例,将任务传递给它的execute()方法。

  

package com.howtodoinjava.demo.multithreading;
 
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
 
public class BasicThreadPoolExecutorExample 
{
    public static void main(String[] args) 
    {
        //Use the executor created by the newCachedThreadPool() method 
        //only when you have a reasonable number of threads 
        //or when they have a short duration.
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
        for (int i = 0; i <= 5; i++) 
        {
            Task task = new Task("Task " + i);
            System.out.println("A new task has been added : " + task.getName());
            executor.execute(task);
        }
        executor.shutdown();
    }
}

 输出:

 

A new task has been added : Task 0
A new task has been added : Task 1
A new task has been added : Task 2
A new task has been added : Task 3
A new task has been added : Task 4
A new task has been added : Task 5
Doing a task during : Task 5
Doing a task during : Task 0
Doing a task during : Task 2
Doing a task during : Task 1
Doing a task during : Task 4
Doing a task during : Task 3

 一些关键点:

1. ThreadProolExecutor有四个不同的构造器,考虑到其复杂性,Java并发API提供了Executors类来构建执行器和相关对象。尽管我们可以直接通过其构造函数来生成ThreadPoolExecutor,使用Executors类是更加推荐的方式。

 

2. 上述例子中中我们创建了一个缓存线程池(cached thread pool),当执行新任务时如果需要则创建新线程;当已有线程完成了它们执行的任务之后可以重用。缓存线程池的一个缺点在于它会不断创建新的线程,如果向此executor发送了过多任务,可能会导致系统负载过高。通过固定线程线程池可以解决这个问题,后面详述

 

3. 关于ThreadPoolExecutor类的重要一点(也适用于其他的executor),你必须显式地结束它。否则它将会一直执行下去,程序将不会结束。当executor没有任务执行时,它持续等待新的任务,并不会结束执行。Java应用程序只有当所有的非守护线程都结束后才会停止执行。所以如果不结束executor,你的程序将永远不会结束。

 

4. 为了结束executor,你可以使用ThreadPoolExecutor类的shutdown()方法。当executor结束所有的待执行任务时,它将会停止运行。当调用shutdown()方法之后,如果尝试把另外一个任务发送给此执行器,执行器将会拒绝并抛出RejectedExecutionException异常。

 

5. ThreadPoolExecutor类提供了用于获取状态信息的一组方法,在示例程序中,我们可以使用getPoolSize(),getActiveCount()以及getCompletedTaskCount()方法以获取线程池大小,线程数量,此执行器执行完成的任务数量等信息。你也可以调用 getLargestPoolSize()方法获取此线程池曾经存在的最大线程数量。

 

6. ThreadPoolExecutor类也提供用于结束execuor执行的其他相关方法:

  • shutdownNow():此方法会将execuor立刻关闭。挂起的任务将不会执行。它返回所有挂起任务的列表。正在执行呃任务将继续执行,但此方法不会等待它们执行完成。
  • isTerminated():当shutdown()shutdownNow()方法被调用,并且executor结束关闭过程后,此方法返回true。
  • isShutdown():当你调用shutdown()方法之后,此方法返回true。
  • awaitTermination(long timeout, TimeUnit unit):此方法阻塞所有的调用线程,直到此执行器任务结束或超时时间到。TimeUnit类包含了如下枚举值:DAYS,HOURS,MICROSECONDS等。

原文链接

 

2
3
分享到:
评论

相关推荐

    java 线程池例子ThreadPoolExecutor

    * 降低了系统的开销:ThreadPoolExecutor 可以重复使用线程,避免了频繁创建和销毁线程的开销。 * 提高了系统的灵活性:ThreadPoolExecutor 可以根据不同的工作负载动态地调整线程池的大小。 ThreadPoolExecutor 的...

    python线程池 ThreadPoolExecutor 的用法示例

    从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和ProcessPoolExecutor (进程池)两个类。 相比 threading 等模块,该模块通过 submit 返回的是一个 future ...

    Java基础篇:Executor框架.pdf

    该文档详细记录了Executor框架结构、使用示意图、ThreadPoolExecutor使用示例、线程池原理分析、几种常见线程池(FixedThreadPool、SingleThreadExecutor、CachedThreadPool)的详解以及线程池大小确定等内容

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    在上面的示例中,我们使用ThreadPoolExecutor类构造了一个线程池,线程池的corePoolSize为5,maximumPoolSize为10,keepAliveTime为60秒,unit为 TimeUnit.SECONDS,workQueue为ArrayBlockingQueue,handler为...

    线程池ThreadPoolExecutor使用简介与方法实例

    今天,我们将对线程池ThreadPoolExecutor进行详细的介绍,并提供一些实际的使用示例。 一、线程池ThreadPoolExecutor简介 ThreadPoolExecutor是Java中的一个类,它实现了Executor接口,用于管理线程池中的线程。...

    线程池使用示例(含源代码)

    在提供的"线程池示例"文件中,应该包含了创建和使用线程池的代码示例,你可以参考并进行扩展,例如添加更多任务、调整线程池参数,或者实现自定义的线程工厂和拒绝策略,以加深对线程池的理解。

    Java网络编程示例代码

    这些示例可能包含并发控制(如synchronized关键字,Lock接口),线程池的使用(ExecutorService,ThreadPoolExecutor)以及线程间的通信(如wait(),notify(),Condition等)。 其次,URL/RMI编程示例代码涉及到...

    Java ThreadPoolExecutor 线程池的使用介绍

    提供工厂方法来创建不同类型的线程池,这篇文章主要介绍了Java ThreadPoolExecutor 线程池的使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来...

    java ThreadPoolExecutor 并发调用实例详解

    在给定的代码中,我们可以看到一个使用 ThreadPoolExecutor 并发调用实例的示例。在这个示例中,我们首先创建了一个 ThreadPoolExecutor 对象,并将其配置为拥有 8 个核心线程和 12 个最大线程,keep alive 时间为 ...

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    这个类是Spring对Java内置的`java.util.concurrent.ThreadPoolExecutor`的封装,允许开发者在Spring应用上下文中声明式地定义线程池。在本篇文章中,我们将深入探讨`ThreadPoolTaskExecutor`的配置及其使用,并结合`...

    Python线程池模块ThreadPoolExecutor用法分析

    要使用`ThreadPoolExecutor`,首先需要导入模块: ```python from concurrent.futures import ThreadPoolExecutor ``` ### 创建线程池 创建线程池时,可以指定`max_workers`参数来设置最大工作线程的数量。例如,...

    工作队列示例

    这篇博客文章的标题“工作队列示例”可能介绍了一个如何使用工作队列来实现高效并发操作的实际应用。 工作队列通常由生产者和消费者两部分组成。生产者负责将任务放入队列,而消费者则从队列中取出任务并执行。这种...

    corejava12示例代码

    - 线程池:ExecutorService,ThreadPoolExecutor,Callable和Future接口。 - Lock接口及ReentrantLock:提供更灵活的锁机制。 6. **反射** - Class类:获取类的信息,如类名、方法、属性等。 - 动态实例化:...

    线程池示例代码

    `ThreadPoolDemo.rar`和`thread_pool.rar`可能是线程池的实现示例,可能包含了一些基本的线程池设计和使用方法。这些示例通常会展示如何初始化线程池,提交任务,以及在适当的时候关闭线程池。分析这些示例可以帮助...

    java 多线程示例

    Java的`ExecutorService`和`ThreadPoolExecutor`类提供了一种更高效的方式来管理和控制线程,可以避免频繁创建和销毁线程的开销。 10. **Callable与Future** `Callable`接口类似于`Runnable`,但允许返回结果。`...

    Java 并发编程实战 中英文+代码示例

    6. **线程池**:Executor框架是Java并发编程的重要组成部分,讲解ThreadPoolExecutor的使用,包括线程池的参数配置、工作队列的选择以及线程池的生命周期管理。 7. **死锁与活锁**:分析可能导致线程死锁的原因,...

    Django如何使用asyncio协程和ThreadPoolExecutor多线程

    以下是如何使用它的示例: ```python from concurrent.futures import ThreadPoolExecutor def io_task1(self, sleep_time): time.sleep(sleep_time) return 66 async def make_future(self, func, *args): ...

    java多线程应用实现示例

    Java 5及以上版本引入了ExecutorService和ThreadPoolExecutor,它们可以帮助我们管理线程池,有效地复用线程,减少系统开销。在小球运动模拟中,可能使用线程池来管理多个小球的线程,避免了频繁创建和销毁线程。 ...

    Java多线程示例 可以直接运行

    使用示例: ```java ExecutorService executor = Executors.newSingleThreadExecutor(); Future&lt;Integer&gt; future = executor.submit(new Callable() { @Override public Integer call() throws Exception { ...

    12-线程池ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf

    #### 2.2 状态转换示例 例如,当线程池从`RUNNING`状态转换到`SHUTDOWN`状态时,可以通过将`ctl`的高3位从`111`改为`000`来实现。 ### 三、线程池添加线程源码解析 线程池添加线程的过程主要涉及以下几个步骤: ...

Global site tag (gtag.js) - Google Analytics