使用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
相关推荐
"JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...
java.util.concurrent包是JDK5.0(JDK1.5更名后)引入的高级并发特性,主要包括原子量、并发集合、同步器、可重入锁,并对线程池的构造提供了强力的支持。该包充分利用了现代多处理器和多核心系统的功能,以编写大...
一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...
如何启动:以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)使用简介
import java.util.concurrent.*; ConcurrentHashMap, String> 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-17.0.2_doc-all"文档集全面覆盖了Java 17.0.2版本的特性,是理解、学习和使用Java编程语言的关键资源。 在Java 17.0.2中,我们可以找到以下几个关键的知识点: 1. **核心类库**:Java API文档首先会介绍...
java.util.SortedSet 分布式 java.util.Queue 分布式 of java.util.Deque 分布式 java.util.Map 分布式 java.util.concurrent.ConcurrentMap 通过TTL实现可重入 java.util.concurrent.locks.Lock 分布式 ...
首先,Java中的线程池设计始于JDK 5.0,主要通过`java.util.concurrent`包中的`Executor`接口实现。这个接口仅有一个`execute()`方法,用于提交执行任务。我们也将遵循这个设计,实现一个简单的线程池类`...
在`java.util.concurrent`包下,JDK 1.8提供了丰富的并发工具类,如线程池`ExecutorService`, 锁`ReentrantLock`, 异步计算`Future`等,这些工具极大地简化了多线程编程。 4. **NIO与NIO.2**: `java.nio`和`java...
JDK自带线程池分析 JDK 自带线程池是 Java 语言中用于管理和执行线程的工具,旨在提高多线程...通过本文的介绍,我们可以了解 JDK 自带线程池的组成、创建方法和优点,从而更好地使用线程池来开发高效的多线程程序。
- 对于定时任务的执行,backport-util-concurrent提供了ScheduledThreadPool,这是一个可调度的线程池,能够在指定延迟后执行任务,或者定期执行周期性任务,虽然功能相比Java 5的ScheduledExecutorService有所简化...
9. **改进的并发库**:对`java.util.concurrent`包进行了优化,如`ForkJoinPool`和`Parallel Streams`,提升了多线程处理性能。 10. **新的`Optional`类**:为了解决空指针异常问题,引入了`Optional`类,它是一个...
由于本机安装的jdk版本与tomcat中使用的jdk版本不一致导致的。 解决方法 后面我把原先tomcat启动环境用的jdk1.7改为了本机安装的jdk1.8就不在报错。 具体过程: 在myeclipse中点击window→preference→在搜索框中...
例如,`java.util.function.Function` 和 `java.util.concurrent.Callable`。 3. **方法引用和构造器引用**:除了lambda表达式,Java 8还提供了方法引用和构造器引用,它们允许直接引用已有方法或构造器,而无需...
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
3. **多线程编程**:Java提供了对多线程编程的支持,通过`java.lang.Thread`类和`java.util.concurrent`包,开发者可以创建和管理多个执行线程,实现并发和并行计算。 4. **异常处理**:Java的异常处理机制是通过`...
4. **多线程**:`java.lang.Thread`和`java.util.concurrent`包中的类,如`ExecutorService`、`ThreadPoolExecutor`等,展示了如何实现并发和异步执行。 5. **反射机制**:`java.lang.reflect`包中的类,如`Class`...
3. **并发编程**:如java.util.concurrent,包含线程池、同步工具类等,用于高效地处理并发任务。 4. **NIO(非阻塞I/O)**:java.nio包提供了通道、缓冲区和选择器,为高性能网络编程提供支持。 5. **反射API**:...