concurrent在线文档:
http://www.cjsdn.net/Doc/JDK50/java/util/concurrent/Executors.html
http://www.cjsdn.net/Doc/JDK50/java/util/concurrent/ScheduledExecutorService.html
java.util.concurrent包主要接口和类:
Executor:具体Runnable任务的执行者。
ExecutorService:一个线程池管理者,其实现类有多种,我会介绍一部分。我们能把Runnable,Callable提交到池中让其调度。
Semaphore:一个计数信号量
ReentrantLock:一个可重入的互斥锁定 Lock,功能类似synchronized,但要强大的多。
Future:是与Runnable,Callable进行交互的接口,比如一个线程执行结束后取返回的结果等等,还提供了cancel终止线程。
BlockingQueue:阻塞队列。
CompletionService: ExecutorService的扩展,可以获得线程执行结果的
CountDownLatch:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CyclicBarrier:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点
Future:Future 表示异步计算的结果。
ScheduledExecutorService :一个 ExecutorService,可安排在给定的延迟后运行或定期执行的命令。
下面主要介绍ScheduledExecutorService
ScheduledExecutorService
一个 ExecutorService,可安排在给定的延迟后运行或定期执行的命令。
schedule 方法使用各种延迟创建任务,并返回一个可用于取消或检查执行的任务对象。scheduleAtFixedRate 和 scheduleWithFixedDelay 方法创建并执行某些在取消前一直定期运行的任务。
用 Executor.execute(java.lang.Runnable) 和 ExecutorService 的 submit 方法所提交的命令,通过所请求的 0 延迟进行安排。
schedule 方法中允许出现 0 和负数延迟(但不是周期),并将这些视为一种立即执行的请求。
所有的 schedule 方法都接受相对 延迟和周期作为参数,而不是绝对的时间或日期。将以 Date 所表示的绝对时间转换成要求的形式很容易。
例如,要安排在某个以后的日期运行,可以使用:schedule(task, date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)。
但是要注意,由于网络时间同步协议、时钟漂移或其他因素的存在,因此相对延迟的期满日期不必与启用任务的当前 Date 相符。
Executors 类为此包中所提供的 ScheduledExecutorService 实现提供了便捷的工厂方法。
样例01:
许多长时间运行的应用有时候需要定时运行任务完成一些诸如统计、优化等工作,比如在电信行业中处理用户话单时,需要每隔1分钟处理话单;网站每天凌晨统计用户访问量、用户数;大型超时凌晨3点统计当天销售额、以及最热卖的商品;每周日进行数据库备份;公司每个月的10号计算工资并进行转帐等,这些都是定时任务。通过 java的并发库concurrent可以轻松的完成这些任务,而且非常的简单。
package com.amg.test; import static java.util.concurrent.TimeUnit.SECONDS; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; public class TestScheduledThread { public static void main(String[] args) { final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2); final Runnable beeper01 = new Runnable() { int count = 0; @Override public void run() { System.out.println(new Date() + " beep01 " + (++count)); } }; final Runnable beeper02 = new Runnable() { int count = 0; @Override public void run() { System.out.println(new Date() + " beep02 " + (++count)); } }; // 任务1:1秒钟后运行,并每隔2秒运行一次 final ScheduledFuture beeperHandle01 = scheduler.scheduleAtFixedRate(beeper01, 1, 2, SECONDS); // 任务2:2秒钟后运行,并每次在上次任务运行完后等待5秒后重新运行 final ScheduledFuture beeperHandle02 = scheduler.scheduleWithFixedDelay(beeper02, 2, 5, SECONDS); // 30秒后结束关闭任务,并且关闭Scheduler scheduler.schedule(new Runnable() { @Override public void run() { beeperHandle01.cancel(true); beeperHandle02.cancel(true); scheduler.shutdown(); } }, 30, SECONDS); } }
为了退出进程,上面的代码中加入了关闭Scheduler的操作。而对于24小时运行的应用而言,是没有必要关闭Scheduler的。
样例02:
说明:下面的例子可实现以上同一功能:
package com.amg.test; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class TestScheduledThreadPoolExecutor { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) { ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1); System.out.println("thread start!!!"); // scheduleAtFixedRate(Runnable对象,run方法执行的时候延迟?秒执行自己的方法,run方法执行时间间隔) exec.scheduleAtFixedRate(new Runnable() {// 每隔一段时间就触发异常 @Override public void run() { // 执行自己的方法 System.out.println("RuntimeException"); } }, 3000, 5000, TimeUnit.MILLISECONDS); exec.scheduleAtFixedRate(new Runnable() {// 每隔一段时间打印系统时间,证明两者是互不影响的 @Override public void run() { // 执行自己的方法 System.out.println(sdf.format(new Date())); } }, 2000, 5000, TimeUnit.MILLISECONDS); } }
相关推荐
Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...
本篇学习笔记将深入解析Java线程池的框架、结构、原理以及相关源码,帮助读者全面理解线程池的工作机制。 1. 线程池模块结构 线程池框架分为多层结构,其中包括核心实现类、辅助类和接口等组件。例如,`sun.nio.ch....
java.util.concurrent java.util.concurrent java.util.locks java.util.atomic 进程/线程 并发/并行 线程 package com.ntuzy.juc_01 ; import java.util.concurrent.Callable ; import java.util.concurrent....
这本"Java并发编程学习笔记"可能是作者在深入研究Java并发特性、工具和最佳实践过程中积累的心得体会。下面,我们将根据这个主题,探讨一些关键的Java并发编程知识点。 1. **线程与进程**:在多任务环境中,线程是...
3. **同步机制**:Java提供了多种同步机制,如`synchronized`关键字、`volatile`关键字、`Lock`接口(包括`ReentrantLock`可重入锁)和`java.util.concurrent`包下的工具类。这些机制用于解决多线程环境下的数据一致...
这份"Java JDK 6.0基础学习笔记"涵盖了该版本的关键知识点,包括语法、类库更新以及开发环境的搭建。 首先,JDK 6.0中的一个重要变化是引入了增强的for循环(Enhanced For Loop),也称为foreach循环,简化了对数组...
本文将基于《Java数据结构和算法》学习笔记中的“栈和队列”部分进行深入探讨。 栈(Stack)是一种线性数据结构,遵循后进先出(LIFO, Last In First Out)的原则。在栈中,元素的添加(压栈)和移除(弹栈)都是在...
Java JDK 5.0是Java开发工具包的一个重要版本,由Sun Microsystems(后被Oracle收购)于2004年发布。...通过阅读“良葛格Java JDK 5.0学习笔记”,读者可以系统地学习和掌握这些内容,进一步提升自己的Java编程技能。
总的来说,这个压缩包中的源码和学习笔记是深入理解并熟练运用Java多线程、反射、泛型和正则表达式的宝贵资源。通过研究这些实例,开发者不仅可以巩固理论知识,还能提升实际编程技巧,从而在日常工作中编写出更加...
Java提供了多种工具,如`synchronized`关键字、`java.util.concurrent`包,来保证线程安全。 12. **Java的安全API**:如`java.security`包中的API,包括密钥和证书管理,数字签名,消息摘要,随机数生成等,这些都...
以下是对"Javajdk5学习笔记"中可能包含的知识点的详细解析: 1. **自动装箱与拆箱**:JDK 5引入了自动装箱和拆箱功能,使得基本类型和它们对应的包装类之间可以无缝转换,提高了代码的简洁性。例如,`Integer i = ...
9. **并发改进**:Java 5.0引入了`java.util.concurrent`包,包含了丰富的并发工具类,如线程池(ExecutorService)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)以及Future和Callable接口,大大简化了...
最后,这个教程可能还会涵盖并发编程的增强,如并发工具类(如`java.util.concurrent`包中的`ExecutorService`、`Semaphore`等)和`java.lang.ThreadLocal`,以及`java.util.concurrent.atomic`包中的原子操作类,...
首先我们知道,JUC就是java.util.concurrent包,俗称java并发包,那首先我们要知道java并发包是用来干嘛 的,然后要知道java并发包包括哪些知识点,这些知识点在平常中有哪些重要的运用,简单来说,这个学习 方法...
《良葛格Java JDK 5.0学习笔记》是一份专为初学者设计的Java编程教程,它以清晰明了的方式介绍了JDK 5.0版本中的核心概念和技术。这份PDF教程涵盖了Java语言的基础到进阶知识,是学习Java开发的理想资源。 1. **...
使用java.util.concurrent类库构造安全的并发应用程序的基础。共享其实就是某一线程的数据改变对其它线程可见,否则就会出现脏数据。
12. **并发工具类(java.util.concurrent)**:包含如Semaphore、CountDownLatch、CyclicBarrier等高级并发控制工具,便于开发多线程应用。 通过《Java JDK 6 学习笔记》中的示例,读者可以深入了解这些特性,并...
4. **并发编程增强**:新增了`java.util.concurrent`包中的工具类,如`ExecutorService`、`Future`等,简化了多线程编程。 5. **改进的垃圾收集**:引入了G1垃圾收集器,这是一种更高效的垃圾回收策略,适用于大内存...