`
hejiajunsh
  • 浏览: 408962 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

java.util.concurrent学习笔记

阅读更多

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 测试源文件

    Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...

    JAVA课程学习笔记.doc

    本篇学习笔记将深入解析Java线程池的框架、结构、原理以及相关源码,帮助读者全面理解线程池的工作机制。 1. 线程池模块结构 线程池框架分为多层结构,其中包括核心实现类、辅助类和接口等组件。例如,`sun.nio.ch....

    java7rt.jar源码-JVM:JVM学习笔记

    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并发编程学习笔记.rar

    这本"Java并发编程学习笔记"可能是作者在深入研究Java并发特性、工具和最佳实践过程中积累的心得体会。下面,我们将根据这个主题,探讨一些关键的Java并发编程知识点。 1. **线程与进程**:在多任务环境中,线程是...

    Java并发编程学习笔记.

    3. **同步机制**:Java提供了多种同步机制,如`synchronized`关键字、`volatile`关键字、`Lock`接口(包括`ReentrantLock`可重入锁)和`java.util.concurrent`包下的工具类。这些机制用于解决多线程环境下的数据一致...

    Java JDK 6.0基础学习笔记.rar

    这份"Java JDK 6.0基础学习笔记"涵盖了该版本的关键知识点,包括语法、类库更新以及开发环境的搭建。 首先,JDK 6.0中的一个重要变化是引入了增强的for循环(Enhanced For Loop),也称为foreach循环,简化了对数组...

    《Java数据结构和算法》学习笔记(3)——栈和队列

    本文将基于《Java数据结构和算法》学习笔记中的“栈和队列”部分进行深入探讨。 栈(Stack)是一种线性数据结构,遵循后进先出(LIFO, Last In First Out)的原则。在栈中,元素的添加(压栈)和移除(弹栈)都是在...

    良葛格Java JDK 5[1].0学习笔记

    Java JDK 5.0是Java开发工具包的一个重要版本,由Sun Microsystems(后被Oracle收购)于2004年发布。...通过阅读“良葛格Java JDK 5.0学习笔记”,读者可以系统地学习和掌握这些内容,进一步提升自己的Java编程技能。

    基于Java的实例源码-多线程反射泛型及正则表达式学习笔记和源码.zip

    总的来说,这个压缩包中的源码和学习笔记是深入理解并熟练运用Java多线程、反射、泛型和正则表达式的宝贵资源。通过研究这些实例,开发者不仅可以巩固理论知识,还能提升实际编程技巧,从而在日常工作中编写出更加...

    给自己记录的JAVA安全学习笔记.zip

    Java提供了多种工具,如`synchronized`关键字、`java.util.concurrent`包,来保证线程安全。 12. **Java的安全API**:如`java.security`包中的API,包括密钥和证书管理,数字签名,消息摘要,随机数生成等,这些都...

    Javajdk5学习笔记

    以下是对"Javajdk5学习笔记"中可能包含的知识点的详细解析: 1. **自动装箱与拆箱**:JDK 5引入了自动装箱和拆箱功能,使得基本类型和它们对应的包装类之间可以无缝转换,提高了代码的简洁性。例如,`Integer i = ...

    良葛格java jdk 5.0学习笔记.rar

    9. **并发改进**:Java 5.0引入了`java.util.concurrent`包,包含了丰富的并发工具类,如线程池(ExecutorService)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)以及Future和Callable接口,大大简化了...

    良葛格java jdk 5.0学习笔记

    最后,这个教程可能还会涵盖并发编程的增强,如并发工具类(如`java.util.concurrent`包中的`ExecutorService`、`Semaphore`等)和`java.lang.ThreadLocal`,以及`java.util.concurrent.atomic`包中的原子操作类,...

    JUC2019.6V1.5.zip

    首先我们知道,JUC就是java.util.concurrent包,俗称java并发包,那首先我们要知道java并发包是用来干嘛 的,然后要知道java并发包包括哪些知识点,这些知识点在平常中有哪些重要的运用,简单来说,这个学习 方法...

    良葛格Java JDK 5.0学习笔记.rar

    《良葛格Java JDK 5.0学习笔记》是一份专为初学者设计的Java编程教程,它以清晰明了的方式介绍了JDK 5.0版本中的核心概念和技术。这份PDF教程涵盖了Java语言的基础到进阶知识,是学习Java开发的理想资源。 1. **...

    JAVA并发编程实践-线程对象与组合对象-学习笔记

    使用java.util.concurrent类库构造安全的并发应用程序的基础。共享其实就是某一线程的数据改变对其它线程可见,否则就会出现脏数据。

    《Java JDK 6 学习笔记》配书示例

    12. **并发工具类(java.util.concurrent)**:包含如Semaphore、CountDownLatch、CyclicBarrier等高级并发控制工具,便于开发多线程应用。 通过《Java JDK 6 学习笔记》中的示例,读者可以深入了解这些特性,并...

    Java JDK 6学习笔记——ppt简体版.rar

    4. **并发编程增强**:新增了`java.util.concurrent`包中的工具类,如`ExecutorService`、`Future`等,简化了多线程编程。 5. **改进的垃圾收集**:引入了G1垃圾收集器,这是一种更高效的垃圾回收策略,适用于大内存...

Global site tag (gtag.js) - Google Analytics