Concurrent包常用方法简介

1 Executor接口

留给开发者自己实现的接口,一般情况下不需要再去实现。它只有一个方法

void execute(Runnable command)

2 ExecutorService接口

它继承自Executor接口,但多了如下3个功能

  1. 终止任务。体现在这几个方法
    1. void shutdown()
      1. 线程池关闭,不接受新任务,即不能再执行submit(task),如果你硬要执行新任务则会抛异常。
      2. 还没运行完的任务继续运行完毕.
    2. List<Runnable> shutdownNow()
      1. 试图停止所有正在执行的活动任务,但不一定成功。
      2. 返回等待执行的任务列表。
  2. 任务提交者与任务的通信,就是Future对象的使用。Future有点类似 windows开发中的句柄概念,通过它可对任务进行监控并获取任务信息。有三种使用方式:
    1. <T> Future<T> submit(Callable<T> task)
    2. Future<?> submit(Runnable task) 
    3. <T> Future<T> submit(Runnable task, T result)
    1. 第一种方法提交的任务,当任务完成后,可以通过Future.get()获取任务的返回值.
    2. 第三种方法提交的任务,当任务完成后,可以通过Future.get()获取提交时传递的参数T result. 比如:
      Future<String> future = service.submit(task,"aaaa");
      String s = future.get();// s="aaaa";
    3. 有趣的是第二种方式,因为它的Future.get()得不到任何内容,它返回值是Null,那为什么不直接把ExecutorService的接口设计成如下这种形式呢
      void submit(Runnable task)

      这是因为Future除了get这种获取任务信息外,还可以控制任务,体现在 Future的这个方法上

      boolean cancel(boolean mayInterruptIfRunning)

      这个方法的JavaDoc解释的很清楚

      Attempts to cancel execution of this task. This attempt will
      fail if the task has already completed, already been
      cancelled, or could not be cancelled for some other reason. If
      successful, and this task has not started when cancel is
      called, this task should never run. If the task has already
      started, then the mayInterruptIfRunning parameter determines
      whether the thread executing this task should be interrupted
      in an attempt to stop the task.

      注意:如果任务没执行完,这3种方式的Future.get()都会阻塞。

  3. 终止任务后可以阻塞一会儿。由ExecutorService的下面这个方法完成
    boolean awaitTermination(long timeout,TimeUnit unit)

    比如

    service.shutdown();
    service.awaitTermination(20, TimeUnit.SECONDS);

    它的意思是,当service.shutdown()后,主线程阻塞,任务执行结束或者阻塞20秒以后,阻塞解除。

3 ScheduledExecutorService接口

它继承自ExecutorService接口。顾名思义,它主要用来定期执行任务或周期执行任务。它只有4个方法,都比较好理解。下面用最简单的例子来做个说明

scheduler.schedule(callable,10,SECONDS); //10秒后开始执行callable任务
scheduler.schedule(runnable,10,Seconds); //10秒后开始执行runnable任务
scheduler.scheduleAtFixedRate(runnable, 5, 10, SECONDS); //5秒后开始执行Runnable任务,然后每隔10秒执行一遍该任务.
scheduler.scheduleWithFixedDelay(runnable,5,10,SECONDS); //5秒后开始执行Runnable任务,然后任务执行完后再等10秒就执行一遍任务,即,每隔任务执行的时间+10秒再执行一遍任务。

这4个方法都返回ScheduledFuture对象.它继承自Future接口,用途和Future差不多。

在JDK之前,计划任务一般由java.until.Timer类来完成。但相比起 ScheduleExecutorService来说,Timer类的功能较为简单,比如下例

private final static long fONCE_PER_DAY = 1000*60*60*24;
Timer timer = new Timer();
timer.scheduleAtFixedRate(fetchMail, getTomorrowMorning4am(), fONCE_PER_DAY);
  1. Timer没有返对象(我总理解为一种句柄),不方便细粒度控制任务。
  2. Timer的任务类型比较单一,只有TimerTask一种。
  3. 没有类似scheduleWithFixedDelay的方法。
  4. 间隔时间的表示方法也不友好。
  5. 性能上也不如ScheduledExecutorService(通过线程池等方式进行了性能优化)出色。

4 Executors类

这个类是一个工厂类,用来生成不同特点的ExecutorService或 ScheduledExecutorService实例。这里主要介绍这些不同特点的实例不同在什么地方。

  1. 3类不同的ExecutorService实例.
    static ExecutorService newSingleThreadExecutor()

    启动一个线程负责任务顺序执行,顺序意味着先提交的任务先执行。其原理是:任务会被提交到一个队列里,启动的那个线程会从队里里取任务,然后执行,执行完,再从队列里取下一个任务,再执行。如果该线程执行一个任务失败,并导致线程结束,系统会创建一个新的线程去执行队里里后续的任务,不会因为前面的任务有异常导致后面无辜的任务无法执行。

    static ExecutorService newCachedThreadPool()

    启动N个线程处理N个任务。既然是多个线程运行,意味着任务不会顺序运行。一个任务完成后,该线程空闲60秒会被结束。新提交的任务会发现空闲线程,并使用它,如果没有空闲线程可用则创建新线程。其实,这就是一个动态线程池。适合于规模比较小、创建较频繁的任务。

    static ExecutorService newFixedThreadPool(int nThreads)

    动态线程池不限制线程的数量,在有些情况下我们不希望线程数量不可控,则可以使用拥有固定线程数目的线程池。运作原理是:任务被提交到一个队列里排队,线程池里的空闲线程会把队列里的任务提出来执行,每个线程执行完一个任务后,就去队列里抓另一个任务出来执行。如果一个线程由于失败而终止,系统会创建另一个线程执行后续任务。

  2. 带ThreadFactory参数生成的ExecutorService实例。以上3种实例创建工作线程时都是用的默认的线程工厂类来创建。也可以指定自己的线程工厂类来创建,以newSingleThreadExecutor(ThreadFactory threadFactory)为例:
    //你自己的实现
    class YourselfThreadFactory implements ThreadFactory {
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r);
            doXXX;
            return thread;
        }
    }
  3. newSingleThreadExecutor 与 newFixedThreadPool(1) 区别.

    JavaDoc上说:Unlike the otherwise equivalent newFixedThreadPool(1) the returned executor is guaranteed not to be reconfigurable to use additional threads.

    什么意思?不懂。为什么?不具体。具体一下就懂了。

    ((ThreadPoolExecutor)newFixedThreadPool(1)).setCorePoolSize(3);

    即newFixedThreadPool(1)可以后期修改线程数,不能保证线程只有一个。而newSingleThreadExecutor可以保证。

  4. static Callable<Object> callable(Runnable task)

    把Runnable任务转换成Callable任务.例子如下

    public static void test() throws Exception {
        Runnable task = new Runnable() {
                public void run() {
                    log("begin task");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                    log("end task");
                }
            };
        Callable c = Executors.callable(task);
        ExecutorService service = Executors.newCachedThreadPool();
        Future f = service.submit(c);
        System.out.println(f.get());//返回null
        log("end");
    }
            
    private static void log(String message) {
        System.out.println(new Date() + ": " + message);
    }
    
    public static void main(String args[]) throws Exception {
        test();
    }

5 结束

JDK1.5引入的concurrent包使多线程编写更加容易、代码更容易理解、可读性更好. 相关文章,请参考 http://hi.baidu.com/dapplehou/blog/item/0a4c65388143b72c96ddd814.html

author: Dapple Hou email: mmonkeyer@163.com

 

http://hi.baidu.com/dapplehou/blog/item/11ccbaa1c8a0789b461064e9.html

java.util.concurrent包 java.util.concurrent包是Java中用于并发编程的重要工具集,提供了丰富的并发原语和组件,以简化多线程编程的复杂性,并帮助开发者编写高效、可伸缩和线程安全的并发程序。 阅读详情

相关推荐

Python concurrent 包

Python concurrent 包1、`concurrent.futures`2、`ThreadPoolExecutor`3、`ProcessPoolExecutor`4、`ProcessPoolExecutor` 支持上下文管理 1、concurrent.futures 异步并行任务编程模块,提供一个高级的异步可执行的便利接口。 提供了两个池执行器: ThreadPoolExecutor 异步调用的线程池的Executor ProcessPoolExecutor 异步调用的进程池的Execut

weixin_44983653的博客 1385

concurrent并发包常用类

计数器CountDownLatch CountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减...

Damon_zqt的博客 1079

使用广播星历进行 GPS 卫星位置的计算

目录1.计算卫星运动的平均角速度 n2.计算观测瞬间卫星的近地点角3.计算偏近点角4.计算真近点角 f5.计算升交角距 6.计算摄动改正项7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置9.计算观测瞬间升交点的经度 L10.计算卫星在瞬时地球坐标系中的位置11.计算卫星在协议地球坐标系中的位置使用广播星历进行GPS卫星位置的计算的详细步骤如下:关于在广播星历中各参数的分布情况可以参考下图:首先根据广播星历中给出的参数 计算参考时刻(TOE) 的平均角速度 式中,GM为万有引力常数 G 与地球总质量

qq_43381998的博客 5567

java concurrent 探秘

java concurrent 探秘(转) 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、notify()和synchronized等,每每需要考虑性能、死锁...

MyKM 841

CentOS 7下Oracle 11G RAC静默安装避坑指南:从网络规划到共享存储配置全流程

本文详细介绍了在CentOS 7环境下进行Oracle 11G RAC静默安装的全流程,包括网络规划、共享存储配置和系统参数调优等关键步骤。特别针对静默安装过程中的常见问题提供了实用的避坑指南和优化建议,帮助技术人员高效完成企业级数据库部署。

weixin_29234509的博客 124

数据库decimal类型详解:精度、标度与金额计算避坑指南

在关系型数据库中,浮点数精度丢失是常见问题,尤其涉及金额计算时,一分钱误差都可能导致对账失败。decimal类型通过十进制存储方式,将小数当作定点数处理,避免了二进制转换误差,确保运算结果精确。其核心在于精度和标度的合理定义,以及运算舍入规则的控制。在电商订单、汇率转换、税务计算等场景中,decimal是保障数据准确性的关键技术。理解其存储原理和实操细节,能有效规避隐式转换、聚合函数精度等常见坑点,提升系统可靠性。

weixin_32050773的博客 271

注解定时器_Spring Scheduler定时器原理分析

首先我们看看简单定时器实现方法:用ScheduledExecutorService接口public interface ScheduledExecutorService extends ExecutorService{ 创建并执行在给定延迟后启用的一次性操作。ScheduledFuture> schedule(Runnable command,long delay,TimeU...

weixin_39829501的博客 378

Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的理论简述和python仿真实现(附源码)

经典论文Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的学习与编程仿真,提供源码

m0_59701926的博客 1238

Java 并发工具包(concurrent)详解

一、concurrent并发包 在JDK1.5之前,Java中要进行业务并发时,不管什么情况下,都需要由程序员独立完成代码实现,此时在进行一些并发设计时需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的危害等,往往会采用一些较为复杂的安全策略,加重了程序员的开发负担。.在JDK1.5出现之后,java.util.concurrent工具包作为简化并发出现。concurrent提供了多种并发模型使我们在相应的情况下大大减少了开发的负担。下面对其中常见实现类进行讲解。 ...

zcm036200的博客 1万+

[逆向实战] 淘宝x5sec滑条验证码slidedata参数逆向与自动化过码方案

本文详细解析了淘宝x5sec滑条验证码的核心参数slidedata的生成机制与逆向过程,提供了Python自动化过码方案。通过分析滑动轨迹加密流程、还原AES加密算法,并设计人类行为模拟轨迹,帮助开发者有效绕过淘宝滑块验证,适用于爬虫开发与自动化测试场景。

weixin_30851867的博客 735

英飞凌TLF35584 SBC实战:手把手教你配置WDG看门狗与ERR监控(基于AUTOSAR架构)

本文详细介绍了基于AUTOSAR架构的英飞凌TLF35584 SBC芯片WDG看门狗与ERR监控功能的配置方法。通过硬件平台搭建、寄存器级配置、AUTOSAR模块集成及诊断策略优化,帮助开发者快速掌握关键配置技巧,提升嵌入式系统的安全性和可靠性。

weixin_30256901的博客 476

Java concurrent包中常用的类

1、 Atomic类      基于 compareAndSwap,即CAS操作实现。 CAS指令有两个步骤:冲突检测和更新操作。      CAS指令需要3个操作数:内存位置(V),旧的预期值(A),新值(B)。CAS指令执行时,首先比较内存位置V处的值和A的值是否相等(冲突检测),如果相等,就用新值B覆盖A(更新操作),否则,就什么也不做。 2、ConcurrentHashMap   ...

BiggerLee的博客 2266

【教程4>第4章>第20节】基于FPGA的costas环整体实现与仿真测试

Costas 环是一种用于载波同步的闭环反馈控制系统,主要应用于通信系统中的相干解调。其基本原理是通过鉴相器(Phase Detector,PD)比较接收信号与本地载波信号的相位差,将这个相位差信息经过环路滤波器(Loop Filter,LF)滤波后,去控制数控振荡器(Numerically Controlled Oscillator,NCO)的输出频率和相位,使得本地载波能够跟踪接收信号的载波,最终实现载波同步。Costas 环环路滤波器在载波同步过程中起着不可或缺的作用。

FPGA/MATLAB学习教程/源码/项目合作开发 1263

DRV8818PWPR与STM32F439ZI工业级步进电机闭环控制实战

步进电机控制在工业自动化中已超越基础开环驱动,演进为高精度、高可靠性、实时闭环的系统工程。其核心原理在于通过电流反馈构建闭环控制回路,结合微步细分与动态PID调节,实现亚毫米级定位与稳定力矩输出。DRV8818PWPR提供集成电流检测与热保护能力,STM32F439ZI凭借硬件浮点与高级定时器支撑实时运算与PWM同步,二者协同构成面向机器人、贴片机、AGV等场景的紧凑型工业驱动单元。技术价值体现在抗干扰设计、EMC防护、热管理及故障诊断链路完整性上,广泛应用于需要中低速大扭矩、高保持力与成本敏感的机电控制系

weixin_33933118的博客 297

斑鬣狗优化算法(SHO)详解:从生物原理到代码实战

斑鬣狗优化算法(SHO)是一种新型元启发式优化算法,灵感来源于斑鬣狗的群体狩猎行为。该算法通过模拟斑鬣狗的包围猎物、协同狩猎和攻击猎物等生物行为,将优化问题转化为智能搜索过程。SHO算法包含探索与开发两个阶段,通过数学模型实现群体协作和自适应平衡,具有参数简单、收敛快等优势。文章系统介绍了SHO的生物基础、数学模型、实现方法(包括MATLAB和Python代码)、改进策略以及在函数优化、路径规划等领域的应用案例,最后讨论了算法的优势、局限性和未来研究方向。

qq_42212808的博客 237

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Concurrent包常用方法简介-转

Table of Contents 1 Executor接口 2 ExecutorService接口 3 ScheduledExecutorService接口 4 Executors类 5 结束 1 Executor接口 留给开发者自己实现的接口,一般情况下不需要再去实现。它只有一个方法 void execute(Runnable com...

iteye_10512的博客 171

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java concurrent 包_java的concurrent包简介

java的concurrent包简介java的concurrent包中的锁lock;工具类:CyclicBarrier、semaphore、CountDownLatch;集合:blockingquue、concurrentMap;原子量:aotmic。先从下面的图开始,介绍下concurrent包的用法。 1、lock类总结几点现在知道的synchronized的异同,基本也就是个认知阶段,并不能...

weixin_29463587的博客 793

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java常用类库——concurrent包

文章目录concurrent包线程类型线程生命周期线程池创建线程池Executor & ExecutorServiceinterface ScheduledExecutorServiceinterface ThreadFactoryclass Executorsclass CountDownLatchinterface Future自定义线程池Java中的Threa...

码农@攻城狮 904

Java学习九—常用包(类)之java.util包

`java.util` 包是Java标准类库中的一个非常重要的组成部分,它提供了一系列对程序开发非常有用的类和接口。这个包主要包含集合框架、日期时间类、事件模型、随机数生成器以及其他实用工具类。

qq_17153885的博客 1万+

java中concurrent包_java的concurrent包

最近在网上看到一个将concurrent包的系列文章,仔细读了一遍,感觉不错。Concurrent包主要有三个package组成。java.util.concurrent:提供大部分关于并发的接口和类,如BlockingQueue,Callable,ConcurrentHashMap,ExecutorService, Semaphore等。java.util.concurrent.atomic:提...

weixin_34966742的博客 447

Java中的concurrent包

concurrent包是在JDK1.5时加入的,常说的concurrent包主要由三个package组成 java.util.concurrent:提供大部分关于并发的接口和类,如BlockingQueue,Callable,ConcurrentHashMap,ExecutorService,Semaphore等。 java.util.concurrent.atomic:提供所有原子操作的类,...

刚学会HelloWorld的XXX的博客 779

说一说java的concurrent包1-concurrent包简介

首页  开源项目    问答   动弹 博客 翻译 资讯  专题    城市圈  [ 登录 | 注册 ] 说一说java的concurrent包1-concurrent包简介说一说java的concurrent包2-等待多个线程完成执行的CountDownLatch 说一说java的concurrent包3-线程安全并且无阻塞的At

pengkai411429850的博客 1594

python3的concurrent包

concurrent包 concurrent.futures 3.2版本引入的模块. 异步并行任务编程模块, 提供一个高级的一部可执行的便利接口. 提供两个池执行器 ThreadPoolExecutor 异步调用的线程池的Executor ProcessPlloExecutor异步调用进程池的Executor 这两个池是惰性的, 不会立即创建线/进程 ThreadPoolExecutor对象 首先...

haihaihai2232的博客 3486

【JAVA】Java.util.concurrent 包

Java.util.concurrent 包

weixin_37559642的博客 1882
上一篇: Java 并发
下一篇: 写了一个快速阅读训练的小软件
mmonkeyer
博客等级 码龄23年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值