`

JDK5的多线程并发库简介

 
阅读更多

JDK5中增加了Doug Lea的并发库,这一引进给java线程的管理和使用提供了强大的便利性。 java.util.current包中提供了对线程优化、管理的各项操作,使得线程的使用变得的心应手。该包提供了线程的运行,线程池的创建,线程生命周期的控制,线程间的协作等功能。


一、核心API介绍
1、 Executor接口
public void execute(Runnable runnable);
该接口声明了execute方法,将Runnable对象传入,启动该方法相当于启动了该线程
2、ExecutorService接口
该接口是Executor的子接口,提供了submit方法,该方法返回Future对象,Future可用于控制线程的执行与取消
3、ScheduledExecutorService接口
该接口是ExecutorService的子接口,提供了线程启动时机的控制


4、Callable接口
提供了如下方法
public Object call() throws Exception;
该接口类似Runnable接口,只是有返回值和抛出的异常,该方法返回的值就是ExecutorService接口调用
submit(Callable call)方法的Future调用get方法返回的值。
5、Future接口
Future接口用于控制线程的执行。调用cancell(boolean bool)方法将会取消正在运行的进程。
另外ExecutorService的shutDown()方法将启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用;shutDownNow()方法试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
6、Executors
这是一个线程池的工厂类,该类提供了许多生成Executor,ExecutorService,ScheduleExecutorService的工厂方法。


其实,Executor就相当于一个线程池,提供对线程的管理功能,包括启动线程,取消线程执行,加入线 程,移除线程,以及协调线程之间的工作等功能,这些随着Executor级别(即子接口,实现类)越高而功 能越强。
二、应用简介
1、启动一个线程
Executor executor=Executors.newFixedThreadPool(3);
executor.execute(new Runnable(){
public void run(){
//your code
}
});
也可以启动Callable形式的线程
ExecutorService executor=Executors.newFixedThreadPool(3);
executor.submit(new Callable(){
public Object call()throws Exception{
Object o=null;
// your code;
return o;
}
});


注意,以上的方法每执行一次就运行一次Runnable或Callable对象的run(),call()方法,如果生成的Executor对象指定了数目,例如上面中是3,则当调用execute方法或submit方法时到达3次以上时,实际上同时运行的线程最多只有3个,是按照顺序的(即多出来的,后放进去的线程没有运行),只有当Executor池中正在运行的线程少于3个(即某些线程处于idle空虚状态,不在运行了),其后多出来的线程才会开始运行(按调用执行的顺序),但任何时候最多只能有3个线程运行。
同一个线程可以被执行多次,多长调用执行方法就行了。


2、取消线程的执行
当想终止线程的执行时,可以调用Future的cancell方法,但也不一定能够终止;另外如果是ExecutorSrvice,也可以调用 shutDownNow或者shutDown方法。shutDown方法将等待当前的线程执行完毕后终止所有的线程,而shutDownNow试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。


3、顺序执行线程
ExecutorService executor=Executors.newFixedThreadPool(3);
Future future=executor.submit(r1);//r1是Runnable或Callable实例
future.get();
executor.submit(r2);/r2是Runnable或Callable实例
以上代码将会使r1执行完后再执行r2,因为Future的get方法具有阻塞调用者线程的功能,执行get方法时,将会等待Future对应的线程执行完毕后才会返回结果,其会阻塞调用者线程。


4、从线程池中添加与移除线程
要移除线程,则需要ExecutorService接口的实现类ThreadPoolExecutor或其子类的方法。
在线程池中添加线程
调用execute或submit方法都可以将线程加入线程池,对同一个线程重复调用也可以,也相当于调用2个不同线程,只不过执行相同的代码。
在线程池中删除线程
public boolean remove(Runnable task)
从执行程序的内部队列中移除此任务(如果存在),从而如果尚未开始,则其不再运行,如果已经删除则返回true

public void purge()
尝试从工作队列移除所有已取消的 Future 任务。

5、线程的协作
利用CyclicBarrier可以协调线程的之间的运行,它允许一组线程互相等待,直到到达某个公共屏障点。
例如有一项工作需要有2个人完成,而这项工作有2个步骤,只有在执行第一个步骤只后,才可以执行第二个步骤,每一个步骤都需要2个人参与。这时可以使用CyclicBarrier了。2个人代表2个线程,如下。
class Worker implements Runnable{
private Work work;
private int speed;
public Work(Work work,int speed){
this.work=work;
this.speed=speed;
}
public void run(){
work.worked(speed);
}

}
class Work {

private CyclicBarrier barrier;
public Work(CyclicBarrier barrier){

this.barrier=barrier;
}
public void worked(int speed){
firstWork(speed);
secondWork();
}
private void firstWork(int speed){

barrier.await();
try{
Thread.sleep(speed);
}catch(Exception e){
}
}
private void secondWork(){

barrier.await();
}
}

public static void main(String args[]){
CyclicBarrier barrier=new CyclicBarrier(2);
Work work=new Work(barrier);
Worker worker1=new Worker(work);
Worker worker2=new Worker(work);
Executor executor=Executors.newFixedPoolThread(2);
executor.execute(worker1);
executor.execute(worker2);
}

6、线程池的线程回收
CompletionService是一个管理执行完毕的线程的类,以Executor为参数构造实例。submit方法用于提交任务,似乎是委派给 Executor执行,而take()方法则是获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。,pool也类似只不过当时没有时返回null并不等待。

分享到:
评论

相关推荐

    JDK5中的多线程并发库.doc

    在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全性。这个库提供了丰富的类和接口,使得开发者能够更好地控制线程的执行、同步和通信。 1. **线程** - **线程与进程的关系**:...

    JDK5中的多线程并发库

    在JDK5中,多线程并发库引入了一系列新的特性,极大地增强了Java处理并发问题的能力。以下是关于这个主题的详细解释: 1. **线程**: - **线程与进程的关系**:进程是一个正在执行的程序实体,而线程是进程内部的...

    JDK5中的并发(多线程)

    JDK 5.0 是用 Java 语言创建高可伸缩的并发应用程序的主要步骤。JVM 已经进行了改进,允许类利用硬件级别支持并发,并且提供了一组丰富的新并发构造块,使开发并发应用程序更加容易。 <br>本教程将介绍 JDK 5.0 ...

    多线程并发技术

    在现代软件开发中,多线程并发技术是提高程序性能和响应速度的关键因素之一。随着计算机硬件的性能持续提升,程序也必须能够有效地利用多核处理器来实现真正的并行处理。JVM(Java虚拟机)作为Java应用程序的运行...

    张孝祥Java多线程与并发库高级应用笔记

    - **JDK1.5线程并发库**:引入了更高级的并发控制机制,如`ExecutorService`、`Callable`、`Future`等,提供了更安全、更高效的多线程解决方案,减少了线程同步和死锁的风险。 ##### 2. 创建线程的两种传统方式 - ...

    基于JDK的多线程归类并发处理闩工具(基于JDK1.8)

    ConcurrentLatch是一个基于JDK的多线程归类并发处理闩工具(基于JDK1.8)。与CountDownLatch不同的是它可以方便的获取哪个任务对应的哪个返回内容。与Future(或者FutureTask)不同的是,他可以通过一系列策略管理多个...

    多线程并发学习书籍

    在IT行业中,多线程并发编程是至关重要的一个领域,特别是在服务器端开发、大数据处理以及高性能计算中。这里提到的“多线程并发学习书籍”集合包含六本关于这一主题的专业书籍,覆盖了2012年至2018年的最新知识。...

    经典Java多线程与并发库高级应用

    总结来说,Java多线程与并发库的高级应用,既包括了传统的多线程编程技术,也包含了JDK 1.5之后引入的高级并发工具和特性。掌握这些知识点对于任何想要在Java编程领域深入发展的开发者来说,都是非常必要的。

    jdk1.5 线程并发与线程池的使用

    在Java编程语言中,线程并发和线程池是多任务执行的核心概念,尤其是在JDK 1.5及以后的版本中得到了显著增强。线程并发允许程序同时执行多个任务,提高了程序的效率和响应性。线程池是管理线程资源的有效方式,通过...

    JDK21虚拟线程详解.pptx.pptx

    这种方式降低了上下文切换的成本,提高了并发性能,同时也降低了多线程编程的复杂性。 **JDK21虚拟线程的特性** 1. **轻量级实现**:虚拟线程不需要操作系统级别的线程,减少了创建和销毁线程的开销。 2. **协作式...

    jdk1.5并发新特性.

    JDK 1.5 引入了一系列重要的并发编程新特性,极大地改善了多线程环境下的程序设计。这些特性使得开发者能够编写更加高效、安全的并发应用程序。以下是对这些新特性的详细解释: 1. `TimeUnit`: `TimeUnit` 是一个...

    java多线程并发编程 核心技术应用实践

    Java多线程并发编程是Java开发中的重要领域,它涉及到如何高效地利用计算机资源,特别是在多核处理器系统中,能够显著提升程序的执行效率。在《java多线程并发编程核心技术应用实践》中,我们将深入探讨Java平台上的...

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    基于JDK并发机制的Java多线程归类处理闩ConcurrentLatch设计源码

    本项目是采用JDK并发机制的Java多线程归类处理闩设计源码,包含29个文件,包括17个Java源文件、8个XML配置文件、1个gitattributes文件、1个iml文件、1个LICENSE文件、1个Markdown文件。ConcurrentLatch工具为多线程...

    Java-jdk10-最新最全多线程编程实战指南-核心篇

    通过阅读《Java-jdk10-最新最全多线程编程实战指南-核心篇》这本书,开发者不仅可以理解Java多线程编程的基础知识,还能掌握高级并发编程技巧,从而在实际项目中实现高性能、高并发的程序设计。对于Java开发者来说,...

    jdk5.zip

    除此之外,JDK 5对Java语言的一些底层机制进行了优化,比如在内存模型(Memory Model)上进行了改进,确保多线程环境下的正确性。另外,它还引入了基于XML的注解处理器(JSR 175),允许开发自定义注解处理器,以在...

    jdk中线程安全的集合类.docx

    综上所述,`ConcurrentHashMap`和`ConcurrentSkipListMap`都是为了解决多线程环境下的并发问题而设计的高效线程安全集合类。`ConcurrentHashMap`通过分段锁和细粒度锁的机制提高了并发性能,而`...

    java的hashMap多线程并发情况下扩容产生的死锁问题解决.docx

    在Java的HashMap中,多线程并发环境下的扩容操作可能会引发死锁问题。这主要发生在JDK 1.7版本,因为其扩容机制采用了头插法。以下详细解释这个问题及其解决方案。 首先,HashMap的扩容机制是在容量达到阈值时触发...

    JDK多线程学习viso分析

    异步不用回填数据,返回页面则需要回填 Viso跨职能流程图可分析各个系统流转流程 Viso环境影响流程图可分析代码功能逻辑流程 场景分析能力和表达能力一定要强 当有两个场景,如一个有权限可以输入三个框,无权限...

Global site tag (gtag.js) - Google Analytics