- 浏览: 143734 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
randyjiawenjie1:
终于遇到一个人讲清楚了
阻塞I/O,非阻塞I/O -
dxqrr:
学习了。。。。
java中堆和堆栈的区别 -
tanhong:
[color=yellow][/color] ...
“is a”和“has a”的区别 -
uuid198909:
代码看着是比较………………
JDK5新特性--java.util.concurrent Semaphore(8) -
heipark:
兄弟,咱这代码纠结了点....
JDK5新特性--java.util.concurrent Semaphore(8)
*1: 定义了几个任务
*2: 初始了任务执行工具。任务的执行框架将会在后面解释。
*3: 执行任务,任务启动时返回了一个 Future 对象,如果想得到任务执行的结果或者是异常可对这个 Future 对象进行操作。 Future 所含的值必须跟 Callable 所含的值对映,比如说例子中 Future 对印 Callable
*4: 任务 1 正常执行完毕, future1.get() 会返回线程的值
*5: 任务 2 在进行一个死循环,调用 future2.cancel(true) 来中止此线程。传入的参数标明是否可打断线程, true 表明可以打断。
*6: 任务 3 抛出异常,调用 future3.get() 时会引起异常的抛出。
运行 Executor 会有以下运行结果:
looping.... Task done. //*1 looping.... looping....//*2 looping.... looping.... looping.... looping.... Thread 2 terminated? :true //*3 //*4 java.util.concurrent.ExecutionException: java.lang.Exception: Callable terminated with Exception! at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205) at java.util.concurrent.FutureTask.get(FutureTask.java:80) at concurrent.Executor.main(Executor.java:43) ……. |
*1: 任务 1 正常结束
*2: 任务 2 是个死循环,这是它的打印结果
*3: 指示任务 2 被取消
*4: 在执行 future3.get() 时得到任务 3 抛出的异常
3:新的任务执行架构
在 Java 5.0 之前启动一个任务是通过调用 Thread 类的 start() 方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制同时执行的线程数量就需要额外编写代码来完成。 5.0 里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是 Executor, ExecutorService 和 ScheduledExecutorService ,让我们先用一个图来显示它们的关系:
图的左侧是接口,图的右侧是这些接口的具体类。注意 Executor 是没有直接具体实现的。
Executor 接口:
是用来执行 Runnable 任务的,它只定义一个方法:
- execute(Runnable command) :执行 Ruannable 类型的任务
ExecutorService 接口:
ExecutorService 继承了 Executor 的方法,并提供了执行 Callable 任务和中止任务执行的服务,其定义的方法主要有:
- submit(task) :可用来提交 Callable 或 Runnable 任务,并返回代表此任务的 Future 对象
- invokeAll(collection of tasks) :批处理任务集合,并返回一个代表这些任务的 Future 对象集合
- shutdown() :在完成已提交的任务后关闭服务,不再接受新任务
- shutdownNow() :停止所有正在执行的任务并关闭服务。
- isTerminated() :测试是否所有任务都执行完毕了。
- isShutdown() :测试是否该 ExecutorService 已被关闭
ScheduledExecutorService 接口
在 ExecutorService 的基础上, ScheduledExecutorService 提供了按时间安排执行任务的功能,它提供的方法主要有:
- schedule(task, initDelay): 安排所提交的 Callable 或 Runnable 任务在 initDelay 指定的时间后执行。
- scheduleAtFixedRate() :安排所提交的 Runnable 任务按指定的间隔重复执行
- scheduleWithFixedDelay() :安排所提交的 Runnable 任务在每次执行完后,等待 delay 所指定的时间后重复执行。
代码: ScheduleExecutorService 的例子
public class ScheduledExecutorServiceTest { public static void main(String[] args) throws InterruptedException, ExecutionException{ //*1 ScheduledExecutorService service = Executors.newScheduledThreadPool(2); //*2 Runnable task1 = new Runnable() { public void run() { System.out.println("Task repeating."); } }; //*3 final ScheduledFuture future1 = service.scheduleAtFixedRate(task1, 0, 1, TimeUnit.SECONDS); //*4 ScheduledFuture future2 = service.schedule(new Callable(){ public String call(){ future1.cancel(true); return "task cancelled!"; } }, 5, TimeUnit.SECONDS); System.out.println(future2.get()); //*5 service.shutdown(); } } |
这个例子有两个任务,第一个任务每隔一秒打印一句“ Task repeating ” , 第二个任务在 5 秒钟后取消第一个任务。
*1: 初始化一个 ScheduledExecutorService 对象,这个对象的线程池大小为 2 。
*2: 用内函数的方式定义了一个 Runnable 任务。
*3: 调用所定义的 ScheduledExecutorService 对象来执行任务,任务每秒执行一次。能重复执行的任务一定是 Runnable 类型。注意我们可以用 TimeUnit 来制定时间单位,这也是 Java 5.0 里新的特征, 5.0 以前的记时单位是微秒,现在可精确到奈秒。
*4: 调用 ScheduledExecutorService 对象来执行第二个任务,第二个任务所作的就是在 5 秒钟后取消第一个任务。
*5: 关闭服务。
Executors 类
虽然以上提到的接口有其实现的具体类,但为了方便 Java 5.0 建议使用 Executors 的工具类来得到 Executor 接口的具体对象,需要注意的是 Executors 是一个类,不是 Executor 的复数形式。 Executors 提供了以下一些 static 的方法:
- callable(Runnable task): 将 Runnable 的任务转化成 Callable 的任务
- newSingleThreadExecutor: 产生一个 ExecutorService 对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。
- newCachedThreadPool(): 产生一个 ExecutorService 对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用。
- newFixedThreadPool(int poolSize) :产生一个 ExecutorService 对象,这个对象带有一个大小为 poolSize 的线程池,若任务数量大于 poolSize ,任务会被放在一个 queue 里顺序执行。
- newSingleThreadScheduledExecutor :产生一个 ScheduledExecutorService 对象,这个对象的线程池大小为 1 ,若任务多于一个,任务将按先后顺序执行。
- newScheduledThreadPool(int poolSize): 产生一个 ScheduledExecutorService 对象,这个对象的线程池大小为 poolSize ,若任务数量大于 poolSize ,任务会在一个 queue 里等待执行
以下是得到和使用 ExecutorService 的例子:
代码:如何调用 Executors 来获得各种服务对象
//Single Threaded ExecutorService ExecutorService singleThreadeService = Executors.newSingleThreadExecutor(); //Cached ExecutorService ExecutorService cachedService = Executors.newCachedThreadPool(); //Fixed number of ExecutorService ExecutorService fixedService = Executors.newFixedThreadPool(3); //Single ScheduledExecutorService ScheduledExecutorService singleScheduledService = Executors.newSingleThreadScheduledExecutor(); //Fixed number of ScheduledExecutorService ScheduledExecutorService fixedScheduledService = Executors.newScheduledThreadPool(3); |
4: Lockers和 Condition接口
在多线程编程里面一个重要的概念是锁定,如果一个资源是多个线程共享的,为了保证数据的完整性,在进行事务性操作时需要将共享资源锁定,这样可以保证在做事务性操作时只有一个线程能对资源进行操作,从而保证数据的完整性。在 5.0 以前,锁定的功能是由 Synchronized 关键字来实现的,这样做存在几个问题:
- 每次只能对一个对象进行锁定。若需要锁定多个对象,编程就比较麻烦,一不小心就会出现死锁现象。
- 如果线程因拿不到锁定而进入等待状况,是没有办法将其打断的
在 Java 5.0 里出现两种锁的工具可供使用,下图是这两个工具的接口及其实现:
发表评论
-
JDK5新特性--java.util.concurrent ExecutorCompletionSe
2008-07-04 10:25 1292考 虑以下场景:浏览网页时,浏览器了5个线程下载网页中的图片 ... -
JDK5新特性--java.util.concurrent CyclicBarrier(3)
2008-07-03 15:13 1175在 实际应用中,有时候需要多个线程同时工作以完成同一件事情,而 ... -
java基础--Java 5.0多线程编程(3)
2008-07-03 14:35 1359Lock 接口 ReentrantLock 是 Loc ... -
java基础--Java 5.0多线程编程(1)
2008-07-03 14:13 1501Java自 1995 ... -
关于用信号量Semaphore完成互斥锁Mutex
2008-07-03 11:26 2630本文探讨用信号量Semaphore实现互斥锁Mutex的问题 ... -
JDK5新特性--java.util.concurrent Semaphore(8)
2008-07-03 10:43 5910操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Ja ... -
使用Callable返回结果
2008-07-02 14:50 1758本文是Sun ... -
Java线程join()方法的用处
2008-07-02 14:24 6208run() 和start() 是大家都很熟悉的两个方法。把希望 ... -
JDK5新特性--java.util.concurrent BlockingQueue(4)
2008-07-02 10:57 2478并 发库中的BlockingQueue 是一个比较好玩的类,顾 ... -
JDK5新特性--java.util.concurrent CountDownLatch(5)
2008-07-02 09:34 1409从 名字可以看出,CountDownLatch 是一个倒数计 ... -
中断JAVA线程
2008-06-30 22:44 1548在JAVA中,通过其对线程类的内嵌支持,编程人员编 ... -
JAVA中断线程的方法
2008-06-30 11:26 2157Thread.stop , Thread.suspend , ... -
不可变性
2008-05-28 09:29 10243.4 不可变性 为了满足同步的需要,另一种方法是使用不可变 ... -
使用不常进行修改的可变集合来减少应用程序的同步开销
2008-05-28 00:12 1328使用多个 Java 线程之间 ... -
正确理解java构造函数内非final函数
2008-05-27 21:49 1450大家都知道java构造 的使用方法吧, 可能大家都用它来进行 ... -
Java 理论和实践:变还是不变?
2008-05-27 21:28 891不变对象具备许多能更方便地使用他们的特性,包括不严格的同步需求 ... -
线程同步原则
2008-05-27 21:14 1030同步的基本规则:只要读取可能由其他线程写入的变量,或者写入随后 ... -
Java的多线程及安全性
2008-05-27 21:11 3062多线程 是一种机制, ... -
利于ThreadLocal管理Hibernate Session
2008-05-26 16:25 1158在利用Hibernate开发DAO模块时,我们和 ... -
ThreadLocal的几种误区
2008-05-26 16:10 970ThreadLocal的几种误区 最近由于需要用到 ...
相关推荐
- **并发工具包**:包括了新的并发类,如`Executor`框架、`ConcurrentHashMap`等,使得编写多线程程序更加容易。 - **泛型集合**:提供了泛型化的集合类,提高了类型安全性。 - **正则表达式引擎**:支持更强大的...
最新Java 5.0多线程编程。
6. **多线程**:线程的创建与同步,线程池,synchronized关键字,wait()、notify()和notifyAll()方法。 7. **反射机制**:Class类的使用,通过反射动态创建对象,调用方法,获取类信息。 8. **泛型**:泛型类、...
### Java 5.0 多线程编程 #### 核心知识点概述 Java 5.0 的发布标志着 Java 在并发编程领域的一个重大突破。在 Java 5.0 之前,多线程编程主要依赖于 `Thread` 类、`Runnable` 接口以及对象的 `wait()`、`notify()...
Java 5.0版本引入了许多重要的新特性和改进,其中就包括对多线程编程的加强。这一进步在Java并发API中得到了体现,尤其是`java.util.concurrent`包的引入,极大地方便了Java并发程序的开发。本文将结合Java 5.0中的...
通过以上两个新增的线程创建方式,我们可以看到Java 5.0版本在多线程编程方面的改进和增强。使用`Callable`接口和线程池不仅提高了线程管理的灵活性,还增强了程序的可扩展性和性能表现。在实际开发过程中,根据具体...
8. **多线程(Multithreading)**:Java API提供了Thread类和Runnable接口来支持多线程编程,理解和掌握线程的同步、互斥、线程池等概念对于开发高并发应用程序至关重要。 9. **I/O流(Input/Output Streams)**:...
并发处理方面,增加了并发工具类如`ExecutorService`,`Semaphore`和`CountDownLatch`等,使得多线程编程更加容易和高效。 在面向对象设计方面,Java 5.0支持注解(Annotations),这是一种元数据形式,可以用来...
8. **多线程**:Java内置对多线程的支持,通过Thread类或实现Runnable接口来创建和管理线程,理解并发编程的概念,如同步、互斥、死锁和线程池等。 9. **接口与抽象类**:接口是完全抽象的,只包含方法签名,不包含...
**Java的高级编程接口**包括四个专题:Java图形GUI编程、多线程编程、I/O编程和网络编程。 - **Java图形GUI编程**涉及Java的AWT(Abstract Window Toolkit)和Swing库,用于创建用户界面。AWT提供了基本的组件和...
- **多线程**:Java支持多线程编程,可以实现并发操作。 **用途:** - **开发应用程序**(Applications):适用于桌面应用程序、移动应用程序等。 - **开发Applet**:早期用于开发Web页面中的小应用程序或组件。 - ...
Java编程语言以其强大的功能和广泛的应用领域而备受程序员青睐,特别是在多线程、泛型、反射、输入/输出(IO)以及容器类和注解等方面的深入理解和应用,能够提升程序的性能和可维护性。本资源包聚焦于这些关键知识...
【Java SE核心2】是达内教育TTS5.0课程体系中的一...通过学习《达内JAVA TTS5.0 PDF——JAVA SE核心2》中的内容,开发者可以提升编程技巧,更好地应对复杂项目的需求,为后续的Java EE和Java框架学习打下坚实的基础。
1. Java基础:包括类、对象、接口、异常处理、多线程等核心概念。 2. 面向对象设计:封装、继承、多态等原则的应用。 3. Java集合框架:如ArrayList、LinkedList、HashMap等数据结构的使用。 4. 输入输出(I/O)与网络...
例如,使用LRU(Least Recently Used)缓存策略来处理常用日志查询,通过多线程或异步I/O提高并发处理能力,以及利用CPU亲和性调度来减少上下文切换开销。 最后,Roclog v5.0.23.0的源码还提供了学习和研究的机会,...
7. **多线程**:Java提供了内置支持进行多任务处理,通过Thread类和Runnable接口实现。这部分会讲解线程的创建、同步和通信方法。 8. **文件和文件系统**:学习如何操作文件和目录,包括创建、删除、移动和读写文件...
10. **并发编程改进**:Java 5.0引入了`java.util.concurrent`包,包含各种线程安全的数据结构和并发工具类,如ExecutorService、Future、CountDownLatch和CyclicBarrier等,简化了多线程编程。 以上只是Java API ...