`
supben
  • 浏览: 330160 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java concurrent

    博客分类:
  • JVM
 
阅读更多
concurrent 包里主要有 Executor,Executors,ExecutorService,Callable这几个包或者接口。

Executor 执行者。在concurrent 不直接调用thread的start执行任务,而是用Excutor的 excute实现 而
Executors和Executor 的关系就相当于 Collection和Collections的关系,
后者是操作前者的工具类。至于ExecutorService是一个接口,Executors创建的线程池都实现了这个接口,实现了常用的操作方法。也就是说,一般不直接使用Executor ,而用线程池ExecutorService。

另外Callable 相当于 带返回值的 Runnable,在线程池中通过调用submit方法,会得到任务运行的结果。比如
Future<String> f = service.submit(new Call());
System.out.println(f.get());



为什么要这么运行线程,而不是直接用start方法呢?因为线程池ExecutorService提供了很多很有用的方法。比如结束任务,这个Thread是做不到的。

package com.supben.task;

public class Task implements Runnable {

	private final int i;

	public Task(int i) {
		this.i = i;
	}

	@Override
	public void run() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("第" + i + "个任务开始......");
	}

}



package com.supben.executor;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.supben.task.Task;

public class Test {

	static ExecutorService service = Executors.newFixedThreadPool(5);

	public static void shutup() {
		for (int i = 1; i < 101; i++) {
			service.execute(new Task(i));
		}
	}

	public static void shutdown() {
		service.shutdownNow();
	}

	public static void main(String[] args) {
		shutup();
		shutdown();
	}
}


执行结果是:抛出5个 sleep interrupted异常。 因为我开始了5个线程,然后再调用强行终止方法,以至于sleep 中断。。。还有个shutdown()方法,他会等待当前正在执行的全部执行完,才会关闭,shutdown后不能再向线程池添加任务。

看看Executors的3个主要方法:
newFixedThreadPool(固定大小线程池)
创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程(只有要请求的过来,就会在一个队列里等待执行)。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。

newCachedThreadPool(无界线程池,可以进行自动线程回收)
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。

newSingleThreadExecutor(单个后台线程)
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。


此外java concurrent还提供了一些很有用的工具包,他们是
Semaphore                 :一个计数信号量
ReentrantLock             :一个可重入的互斥锁定 Lock,功能类似synchronized,但要强大的多。
BlockingQueue             :阻塞队列。
CompletionService         : ExecutorService的扩展,可以获得线程执行结果的
CountDownLatch            :一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CyclicBarrier             :一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点
0
0
分享到:
评论

相关推荐

    java concurrent 精简源码

    本资源“java concurrent 精简源码”着重关注Java并发库(java.util.concurrent)的核心概念,包括阻塞队列和线程管理。下面将详细阐述这些知识点。 1. **Java并发库(java.util.concurrent)** Java并发库是Java ...

    Java Concurrent in practice (animated)

    Java Concurrent in practice (animated)

    Java Concurrent Programming

    为了简化多线程编程,Java提供了一系列工具和API,如`java.util.Timer`和`java.util.concurrent`包,这些工具可以帮助开发者更高效地管理线程间的同步问题。 ##### 1.2 synchronized关键字 `synchronized`关键字是...

    Java Concurrent处理并发需求

    ### Java Concurrent处理并发需求 #### 一、Java并发基础与Concurrent API介绍 在现代软件开发中,尤其是在服务器端应用中,对并发处理的需求日益增长。为了满足这种需求,Java平台提供了一系列强大的工具和API来...

    java concurrent包分类结构图

    java concurrent包分类结构图

    面试-Java一些常见面试题+题解之多线程开发-JavaConcurrent.zip

    JavaConcurrent是Java平台提供的高级并发API,它使得多线程编程更加高效和安全。本资料集合了Java面试中与多线程相关的常见问题及解答,旨在帮助求职者充分准备这一关键领域的知识。 1. **线程的概念与创建** - ...

    JavaConcurrent实用知识库分享知识分享

    在JavaConcurrent库中,提供了丰富的工具类和接口来支持高效的并发编程。 首先,了解多线程的作用至关重要。多线程的主要目的是充分利用多核CPU的计算能力,使得程序能够并行执行不同的任务,提高整体效率。同时,...

    java concurrent program的实现

    EBS java concurrent program的实现

    java concurrent 包 详细解析

    Java并发包(java.concurrent)是Java平台中处理多线程编程的核心工具包,它提供了丰富的类和接口,使得开发者能够高效、安全地编写多线程程序。这个包的设计目标是提高并发性能,减少同步代码的复杂性,并提供高级...

    使用java concurrent调用xmlp api生成pdf

    这里我们关注的是如何使用`java.concurrent`包中的工具和XML Processing API(通常指的是JAXB或DOM4J等处理XML的库)来高效地生成PDF。下面将详细解释这个过程以及涉及的相关知识点。 首先,`java.concurrent`包是...

    java concurrent source code

    资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 封底 Java多线程无处不在,...

    java concurrent in practive

    《Java并发编程实战》还会讨论`java.util.concurrent`包中的高级并发工具,如`ExecutorService`和`Future`,它们可以方便地管理和控制线程池,提高系统的并行处理能力。`CountDownLatch`、`CyclicBarrier`和`...

    JAVA的CONCURRENT用法详解.pdf

    JAVA的CONCURRENT用法详解.pdf

    JAVA Concurrent Programming

    Java 1.5引入了`java.util.concurrent`包,包含了一系列的并发工具类,如线程池、阻塞队列、并发集合等。这些工具旨在提高并发性能并简化编程模型。例如,`ExecutorService`和`ThreadPoolExecutor`提供了线程池管理...

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

    ### Java并发工具包 `java.util.concurrent` 知识点详解 #### 一、引言 随着多核处理器的普及和应用程序复杂度的增加,多线程编程成为了现代软件开发不可或缺的一部分。为了简化并发编程的复杂性,Java 5 引入了 `...

    java_util_concurrent_中文用户使用手册@微信公众号-架构探险之道.zip

    JUC使用指导手册 http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html 中文译文

    动画学习 java.util.concurrent并发工具包

    如何启动:以win7系统为例,最好jdk8 1.打开cmd,cd到jdk的path,本机是:cd C:\Java\jdk6\bin ...java -cp D:\javaConcurrentAnimated.jar vgrazi.concurrent.samples.launcher.ConcurrentExampleLauncher

    javaconcurrent源码-java7-source-code:Java7源码/Concurrency同步

    java concurrent源码 Java7 核心类库源码解析 请直接查看.java : 通过JavaDoc+Test书写 ,方便链接到源码 Tracker 20181014 Java11正式发布并作为新的长期支持版本, 未来的应用会逐步迁移到Java11. 因此Java8以前的...

    java.util.concurrent.uml.pdf

    标题中提到了“java.util.concurrent.uml.pdf”,这表明文件是一份Java并发编程工具包java.util.concurrent的UML(统一建模语言)类结构图的PDF格式文件。UML图能够帮助开发者理解Java并发包中的类、接口及其关系,...

Global site tag (gtag.js) - Google Analytics