`
csf00298
  • 浏览: 1228 次
社区版块
存档分类
最新评论

java.util.concurrent JDK线程池 使用

阅读更多

使用JDK的线程池心得

这里使用的是 java.util.concurrent 包中的线程池。该包中所有方法都是线程安全的。

Executors.newCachedThreadPool();

      API:创建一个可根据需要创建新线程的线程池。 如果想自己设置线程池的参数可以使用使用 :
ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,  long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue)
   参数:
    corePoolSize - 池中所保存的线程数,包括空闲线程。
    maximumPoolSize - 池中允许的最大线程数。
    keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
    unit - keepAliveTime 参数的时间单位。
    workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的     Runnable 任务

目标方法: 

      需要实现Callable接口

public class TestCollable implements Callable<String>{
	private String result ;
	public TestCollable(String result){
		this.result = result;
	}
	@Override
	public String call() throws Exception {
		System.out.println("开始执行任务----"+Thread.currentThread().getName());
		System.out.println("任务: "+result);
		System.out.println("结束任务----"+Thread.currentThread().getName());
		return "bb";
	}
}

 

使用线程池 多线程调用目标方法

@Test 
public void testCall() throws InterruptedException, ExecutionException{
  	//newCachedThreadPool() 创建一个可根据需要创建新线程的线程池
  ExecutorService executorService = Executors.newCachedThreadPool();
	//调用get()方法程序将会阻塞 直到目标方法有返回值或者抛异常
    for(int i=0 ; i<5 ;i++){
           System.out.println(executorService.submit(new TestCollable("aa")).get());
     }
  }  
 }

 执行结果:

开始任务----pool-1-thread-1
任务: aa
任务结束----pool-1-thread-1
bb
开始任务----pool-1-thread-2
任务: aa
任务结束----pool-1-thread-2
bb

  

由此可以看出 executorService.submit(new TestCollable("aa")).get()); 方法阻塞了程序 直到有结果返回

 

 

将执行结果放入list观察 统一输出结果 不再阻塞程序

@Test
	public void testCall() throws InterruptedException, ExecutionException{
		ExecutorService executorService = Executors.newCachedThreadPool();
		ArrayList<Future<String>> results  = new ArrayList<Future<String>>();
		for(int i=0 ; i<5 ;i++){
			results.add(executorService.submit(new TestCollable("aa")));
		}
		for(Future<String> fs:results){
			System.out.println(fs.get());
		}
	}

 

程序执行结果

开始任务----pool-1-thread-1
开始任务----pool-1-thread-2
任务: aa
任务结束----pool-1-thread-2
任务: aa
任务结束----pool-1-thread-1
bb
bb
开始任务----pool-1-thread-3
任务: aa
任务结束----pool-1-thread-3
bb
开始任务----pool-1-thread-4
任务: aa
任务结束----pool-1-thread-4
bb
开始任务----pool-1-thread-5
任务: aa
任务结束----pool-1-thread-5
bb

 

 

2
0
分享到:
评论

相关推荐

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    "JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...

    浅谈java.util.concurrent包中的线程池和消息队列

    java.util.concurrent包是JDK5.0(JDK1.5更名后)引入的高级并发特性,主要包括原子量、并发集合、同步器、可重入锁,并对线程池的构造提供了强力的支持。该包充分利用了现代多处理器和多核心系统的功能,以编写大...

    Java高性能线程库(java.util.concurrent包的补充)

    一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...

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

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

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介.doc

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介

    出现java.util.ConcurrentModificationException 问题及解决办法

    import java.util.concurrent.*; ConcurrentHashMap, String&gt; bb = new ConcurrentHashMap(); bb.put("1", "wj"); bb.put("2", "ry"); for (String key : bb.keySet()) { bb.remove(key); } ``` 在编写多...

    JDK研究系列--》util.concurrent(java.util part3)

    合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--》util.concurrent(java.util part3)

    Java API 文档 jdk-17.0.2-doc-all

    这份"jdk-17.0.2_doc-all"文档集全面覆盖了Java 17.0.2版本的特性,是理解、学习和使用Java编程语言的关键资源。 在Java 17.0.2中,我们可以找到以下几个关键的知识点: 1. **核心类库**:Java API文档首先会介绍...

    Redis客户端Redisson.zip

    java.util.SortedSet 分布式 java.util.Queue 分布式 of java.util.Deque 分布式 java.util.Map 分布式 java.util.concurrent.ConcurrentMap 通过TTL实现可重入 java.util.concurrent.locks.Lock 分布式 ...

    自定义实现Java线程池1-模拟jdk线程池执行流程1

    首先,Java中的线程池设计始于JDK 5.0,主要通过`java.util.concurrent`包中的`Executor`接口实现。这个接口仅有一个`execute()`方法,用于提交执行任务。我们也将遵循这个设计,实现一个简单的线程池类`...

    jdk1.8.0src.zip

    在`java.util.concurrent`包下,JDK 1.8提供了丰富的并发工具类,如线程池`ExecutorService`, 锁`ReentrantLock`, 异步计算`Future`等,这些工具极大地简化了多线程编程。 4. **NIO与NIO.2**: `java.nio`和`java...

    JDK自带线程池分析

    JDK自带线程池分析 JDK 自带线程池是 Java 语言中用于管理和执行线程的工具,旨在提高多线程...通过本文的介绍,我们可以了解 JDK 自带线程池的组成、创建方法和优点,从而更好地使用线程池来开发高效的多线程程序。

    backport-util-concurrent(2.2 /3.1)

    - 对于定时任务的执行,backport-util-concurrent提供了ScheduledThreadPool,这是一个可调度的线程池,能够在指定延迟后执行任务,或者定期执行周期性任务,虽然功能相比Java 5的ScheduledExecutorService有所简化...

    JDK1.8 32位官方版

    9. **改进的并发库**:对`java.util.concurrent`包进行了优化,如`ForkJoinPool`和`Parallel Streams`,提升了多线程处理性能。 10. **新的`Optional`类**:为了解决空指针异常问题,引入了`Optional`类,它是一个...

    Tomcat启动时报错:java.lang.UnsatisfiedLinkError的解决

    由于本机安装的jdk版本与tomcat中使用的jdk版本不一致导致的。 解决方法 后面我把原先tomcat启动环境用的jdk1.7改为了本机安装的jdk1.8就不在报错。 具体过程: 在myeclipse中点击window→preference→在搜索框中...

    jdk1.8.0-144

    例如,`java.util.function.Function` 和 `java.util.concurrent.Callable`。 3. **方法引用和构造器引用**:除了lambda表达式,Java 8还提供了方法引用和构造器引用,它们允许直接引用已有方法或构造器,而无需...

    jdk 中文版

    java jdk api帮助文档中文版 JavaTM Platform ...org.omg.stub.java.rmi org.w3c.dom org.w3c.dom.bootstrap org.w3c.dom.events org.w3c.dom.ls org.xml.sax org.xml.sax.ext org.xml.sax.helpers

    jdkApi.zip_Java jdk1.7_jdkapi

    3. **多线程编程**:Java提供了对多线程编程的支持,通过`java.lang.Thread`类和`java.util.concurrent`包,开发者可以创建和管理多个执行线程,实现并发和并行计算。 4. **异常处理**:Java的异常处理机制是通过`...

    jdk1.8 rt.jar 源码

    4. **多线程**:`java.lang.Thread`和`java.util.concurrent`包中的类,如`ExecutorService`、`ThreadPoolExecutor`等,展示了如何实现并发和异步执行。 5. **反射机制**:`java.lang.reflect`包中的类,如`Class`...

    jdk-17.0.1-doc-all.zip

    3. **并发编程**:如java.util.concurrent,包含线程池、同步工具类等,用于高效地处理并发任务。 4. **NIO(非阻塞I/O)**:java.nio包提供了通道、缓冲区和选择器,为高性能网络编程提供支持。 5. **反射API**:...

Global site tag (gtag.js) - Google Analytics