`

《java多线程学习-java.util.concurrent详解》

阅读更多

执行框程序(Executor):最常见的用法就是用Executors来构造相关的线程池;用CompletionService来分离生产任务和已经完成的任务,生产者 submit 执行的任务。使用者 take 已完成的任务,并按照完成这些任务的顺序处理它们的结果;Callable和Future接口到处都需要用到。

 

队列(Queue):在使用生产者消费者模式的时候需要构建出满足自己自身系统需要的队列。

    同步器(Synchronizer)常见的有5种:

  1. 信号量(Semaphore)用于限制可以访问某些资源(物理的或逻辑的)的线程数目;
  2. 闭锁(CountDownLatch)是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用于在保持给定数目的 信号、事件或条件前阻塞执行。把信号量设置为1的时候就是一个闭锁的实现。
  3. 关卡(CyclicBarrier)允许一个给定数量的成员多次集中在一个关卡点,然后在统一执行后面的操作,这在并行迭代算法中非常有用,能把一个问题拆分成一系列相互独立的子问题。
  4. 交换器(Exchanger)是关卡的另一种形式,它提供了一个同步点,在这个同步点,一对线程可以交换数据。每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程提供的数据,并返回。它在多流水线设计中是有用的。
  5. Future和FutureTask:可取消的异步计算,利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法。FutureTask可以通过线程池来执行。

    并发容器:ConcurrentHashMap来获取的完全并发和更新的所期望可调整并发的哈希表;期望的读数和遍历远远大于列表的更新数时,请使用CopyOnWriteArrayList 代替 ArrayList。

    原子操作(atomic):支持在单个变量上解除锁的线程安全编程;我用的最多的是在多线程中的计数操作。

    互斥锁(Lock):为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器,该框架允许更灵活地使用锁和条件。

    Amdahl定律

    Amdahl定律描述了在一个系统中,基于可并行化和串行化的组件各自所占的比重,程序通过获得额外的计算资源,理论上能够加速多少。如果F是必须串行化执行的比重,那么Amdahl定律告诉我们,在一个N处理器的机器中,我们最多可以加速:1/(F+(1-F)/N)
    当N无限增大趋近无穷时,speedup的最大值无限趋近1/F,这意味着一个程序中如果50%的处理都需要串行进行的话,speedup只能提升2倍(不考虑事实上有多少线程可用);如果程序的10%需要串行进行,speedup最多能够提高近10倍。更多信息点击这里

    Spring中的多线程任务

    在中小型项目中把一些提醒类邮件(邮件发送等级较低)放到spring线程池内执行,可以减少邮件发送等待时间。前提是:这些邮件的发送不需要放到数据库或者是文件系统中持久化。在邮件发送类中引用:TaskExecutor接口来执行邮件发送的线程,spring的配置使用示例:

 

(一) Latch/Barrier

 

1. CountDownLatch
    我们先来学习一下JDK1.5 API中关于这个类的详细介绍:
“一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。”

    这就是说,CountDownLatch可以用来管理一组相关的线程执行,只需在主线程中调用CountDownLatch 的await方法(一直阻塞),让各个线程调用countDown方法。当所有的线程都只需完countDown了,await也顺利返回,不再阻塞了。在这样情况下尤其适用:将一个任务分成若干线程执行,等到所有线程执行完,再进行汇总处理。

    下面我举一个非常简单的例子。假设我们要打印1-100,最后再输出“Ok“。1-100的打印顺序不要求统一,只需保证“Ok“是在最后出现即可。

    解决方案:我们定义一个CountDownLatch,然后开10个线程分别打印(n-1)*10+1至(n-1)*10+10。主线程中调用await方法等待所有线程的执行完毕,每个线程执行完毕后都调用countDown方法。最后再await返回后打印“Ok”。

import java.util.concurrent.CountDownLatch;
/**
 * 示例:CountDownLatch的使用举例
 * Mail: ken@iamcoding.com
 * @author janeky
 */
public class TestCountDownLatch {
	private static final int N = 10;

	public static void main(String[] args) throws InterruptedException {
		CountDownLatch doneSignal = new CountDownLatch(N);
		CountDownLatch startSignal = new CountDownLatch(1);//开始执行信号

		for (int i = 1; i <= N; i++) {
			new Thread(new Worker(i, doneSignal, startSignal)).start();//线程启动了
		}
		System.out.println("begin------------");
		startSignal.countDown();//开始执行啦
		doneSignal.await();//等待所有的线程执行完毕
		System.out.println("Ok");

	}

	static class Worker implements Runnable {
		private final CountDownLatch doneSignal;
		private final CountDownLatch startSignal;
		private int beginIndex;

		Worker(int beginIndex, CountDownLatch doneSignal,
				CountDownLatch startSignal) {
			this.startSignal = startSignal;
			this.beginIndex = beginIndex;
			this.doneSignal = doneSignal;
		}

		public void run() {
			try {
				startSignal.await(); //等待开始执行信号的发布
				beginIndex = (beginIndex - 1) * 10 + 1;
				for (int i = beginIndex; i <= beginIndex + 10; i++) {
					System.out.println(i);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				doneSignal.countDown();
			}
		}
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

   

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java多线程学习-java.util.concurrent详解(一) Latch/Barrier

    `java.util.concurrent`包是Java提供的一个强大的多线程工具库,其中包含了许多类和接口,如`CountDownLatch`和`CyclicBarrier`,它们为程序员提供了更高级别的同步和协调机制。这篇文档将详细解析这两个工具类的...

    java并发工具包 java.util.concurrent中文版pdf

    为了简化并发编程的复杂性,Java 5 引入了 `java.util.concurrent` 包,提供了一系列强大的类和接口,帮助开发者更高效地管理多线程任务。 #### 二、`java.util.concurrent` 概览 `java.util.concurrent` 包提供了...

    jdk-8u20-docs-all.zip

    - `java.lang.Thread`和`java.util.concurrent`:提供了多线程编程的支持,包括创建和管理线程、线程同步和并发工具。 4. **JDBC**: - `java.sql`:提供了与数据库交互的接口和类,如`Connection`、`Statement`...

    深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    Synchronized和java.util.concurrent.locks.Lock都是Java中用于实现线程同步的关键字和接口,它们的主要目标是保证多线程环境下的数据一致性与并发安全。然而,两者在使用方式、控制粒度以及灵活性方面存在显著差异...

    13-Java并发编程学习宝典.zip

    5. **ReadWriteLock读写锁** - "23 按需上锁—ReadWriteLock详解-慕课专栏.html":介绍了`java.util.concurrent.locks.ReadWriteLock`接口,提供了一种在读多写少的场景下提高并发性能的机制。 6. **Future模式** -...

    The java.util.concurrent Synchronizer Framework

    随着Java技术的发展,多线程编程成为了一项重要的技术需求。为了更好地支持并发编程,Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一个包含了许多中级并发支持类的集合,通过Java社区过程(Java ...

    Java并发编程--BlockingQueue.docx

    BlockingQueue 是 Java 并发包(java.util.concurrent)中的一个接口,它扩展了 Queue 接口,并引入了线程安全的特性,特别适合于多线程环境下的数据共享。 BlockingQueue 的核心设计是其在并发环境下提供了高效的...

    Java 多线程与并发(12-26)-JUC锁- ReentrantReadWriteLock详解.pdf

    在Java多线程并发编程中,ReentrantReadWriteLock(可重入读写锁)是一个重要的同步工具,它属于Java并发包(java.util.concurrent.locks)中的一个类。这个锁提供了比标准的synchronized关键字更细粒度的控制,允许...

    Java 多线程与并发(11-26)-JUC锁- ReentrantLock详解.pdf

    Java中的ReentrantLock是Java并发包(java.util.concurrent.locks)中的一个高级锁,它是可重入的,意味着一个线程可以多次获取同一锁。在深入ReentrantLock之前,我们首先需要了解Java并发编程的基础,特别是Java...

    Java 多线程与并发(9-26)-JUC锁- LockSupport详解.pdf

    LockSupport是Java中用于多线程同步的一个工具类,它提供了一组基础的线程阻塞和解除阻塞的方法。这个类位于java.util.concurrent.locks包下,是实现并发编程中AQS(AbstractQueuedSynchronizer)框架的重要基础之一...

    Java 多线程与并发(16-26)-JUC集合- BlockingQueue详解.pdf

    Java中的`BlockingQueue`接口是Java并发编程的重要组件,它位于`java.util.concurrent`包下,主要用于线程间数据的同步和通信。`BlockingQueue`是一个支持线程安全的队列,它允许一个线程放入(插入)元素,而另一个...

    Java线程培训资料

    ### Java线程培训资料知识点详解 #### 一、Java线程基本概念 ...通过以上知识点的学习,可以深入理解Java线程的基本概念、API使用以及Concurrent包中的高级特性,这对于开发高效、稳定的多线程应用程序至关重要。

    java多线程设计模式详解.pdf

    为了达到线程安全和有效管理多线程的目的,读者需要对Java的并发API有深入理解,如java.util.concurrent包中的类和接口,以及Java内存模型和线程生命周期等概念。同时,由于涉及到设计模式,读者还需要对软件设计...

    java-synchronized详解.doc

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。本文将深入解析`synchronized`在Java中的应用和工作原理。 一、`synchronized`的基本用法 `...

    java多线程设计模式详解.rar

    Java多线程设计模式是Java开发中不可或缺的一部分,它涉及到并发编程的核心概念和技术。在Java中,多线程可以提高程序的执行效率,...这个“java多线程设计模式详解.rar”文件无疑是深入学习和理解这一领域的宝贵资源。

    Java多线程设计模式(带源码)

    通过阅读提供的"Java多线程设计模式详解.pdf"和"Java多线程设计模式上传文件",开发者可以深入学习这些模式的原理、实现方式以及实际应用场景,从而在实际工作中更好地运用多线程设计模式,提升软件的并发性能和质量...

    JAVA多线程编程详解-详细操作例子

    本主题将深入探讨“JAVA多线程编程详解-详细操作例子”,结合提供的资源,我们可以从以下几个方面进行学习: 1. **线程的基本概念**: 线程是程序执行的最小单位,一个进程可以有多个线程。在Java中,可以通过实现...

    java API文档

    - **java.util.concurrent**:并发工具类,支持多线程编程。 - **java.util.concurrent.atomic**:原子变量支持。 - **java.util.concurrent.locks**:锁机制支持。 - **java.util.jar**:支持JAR文件的创建和...

Global site tag (gtag.js) - Google Analytics