- 浏览: 279631 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (161)
- 【**计划】 (2)
- 【**Core Java**】 (30)
- 【**JAVA EE】 (6)
- JDBC (3)
- Hibernate专题系列 (0)
- 【**OS】 (14)
- 【**架构设计/设计模式】 (11)
- 【Hadoop】 (3)
- 【**分布式】 (9)
- 模板 (1)
- C (2)
- 常用工具 (1)
- Oracle (2)
- 【Tips】 (3)
- 【数据库】 (2)
- 玩转Ubuntu (0)
- 【计算机网络/网络编程】 (7)
- 【**Search Engine】 (21)
- 【**专题**】 (6)
- 【**Python】 (10)
- XML (1)
- 【**Open Source Framework】 (1)
- 【高级主题】 (1)
- 【存储】 (3)
- 【笔试面试】 (2)
- 【**数据结构与算法设计】 (20)
- 【其他】 (3)
- 【编程练习】 (2)
- 【待完成】 (12)
- 【工作】 (6)
- 【软件研发】 (4)
- 【**多线程多进程编程】 (5)
- 【Web Service】 (1)
- 【表达式解析/JavaCC系列】 (5)
- 【缓存系统:Memcached】 (1)
- 【Java IO/NIO】 (5)
- 【JVM运行机制及内存管理】 (7)
最新评论
-
107x:
...
python list排序 -
yuzhu223:
...
【Python基础】Python的lambda函数与排序 -
Tonyguxu:
分析查询结果的打分小于11.query=1065800715* ...
lucene打分机制的研究 -
Tonyguxu:
query=139320661963.013709 = (MA ...
lucene打分机制的研究 -
Tonyguxu:
query=10658007150.6772446 = (MA ...
lucene打分机制的研究
Executor Framework
Callable VS Runnable
同
1.代表任务,会被线程执行。
不同
1. Callable型的任务能够返回结果或者抛出异常,而Runnable型任务不能
//java.util.concurrent //Interface Callable<V> V call() throws Exception //java.lang //Interface Runnable void run()
2.
两个问题
问题1.Thread的target是Runnable类型的,不能直接将Callable型对象作为Thread 的target。
如何将Callable型对象交给Thread?
任务也能够被执行。根据这个需求注意在Executor的子接口ExecutorService中就增加了相关方法submit(Runnable/Callable),submit方法在子类AbstractExecutorService中给出了实现。实现里通过将Runnable/Callable型任务包装成RunnableFuture(继承了Runnable)从而可以交给execute(Runnable command)执行。
问题3:为什么不让FutureTask直接实现Runnable和Future两个接口,而是增加RunnableFuture接口
问题2.call()方法有返回值——但是call方法并不是直接被调用,而是作为线程执行体被调用。
如何获取call()的返回值?
为了解决问题2,JDK1.5中提供了Future接口来代表call()方法的返回值,并提供了一个实现类FutureTask。可以通过
get方法来获得最后执行的结果。
为了解决问题1,让FutureTask实现了Runnable接口,这样可以将 FutureTask交给Thread执行,间接将Callable交给了
Thread。
FutureTask<V>
A cancellable asynchronous computation.
可取消的异步计算
This class provides a base implementation of Future, with methods to start and cancel a computation, query to see if the computation is complete, and retrieve the result of the computation.
The result can only be retrieved when the computation has completed; the get method will block if the computation has not yet completed. Once the computation has completed, the computation cannot be restarted or cancelled.
A FutureTask can be used to wrap a Callable or Runnable object. Because FutureTask implements Runnable, a FutureTask can be submitted to an Executor for execution.
In addition to serving as a standalone class, this class provides protected functionality that may be useful when creating customized task classes.
Executor接口
ExecutorService接口
AbstractExecutorService抽象类
public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Object> ftask = newTaskFor(task, null); execute(ftask);//ftask是Runnable型 return ftask;//ftask是Future型 } public <T> Future<T> submit(Runnable task, T result) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task, result); execute(ftask); return ftask; } public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task); execute(ftask); return ftask; } protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) { return new FutureTask<T>(runnable, value); } protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) { return new FutureTask<T>(callable); }
为什么不让FutureTask直接实现Runnable和Future两个接口,而是增加RunnableFuture接口?
注意submit方法有返回值Future,通过这个Future就可以对。。
ThreadPoolExecutor类
ScheduledExecutorService接口
ScheduledThreadPoolExecutor类
发表评论
-
【笔试题】Java多线程笔试题
2012-06-21 18:03 1015使用Java多线程实现下述算法: 输入:整数组成的m*n的矩 ... -
【Java并发】并发集合
2012-06-18 17:30 1088ConcurrentHashMap Conc ... -
【Java IO】Java的序列化机制
2012-06-12 18:07 1035Java序列化机制采用的序列化算法: 1.所有保存到磁盘 ... -
关于 Java 对象序列化【转载】
2012-06-04 16:45 1402简介: Java 对象序列化(Java Object Seri ... -
JavaCC/JJTree入门
2012-05-03 18:17 1440JavaCC 介绍 JJTree JJTree为了让 ... -
【Java NIO】内存映射文件
2012-04-24 14:16 1357java.nio包包含对下列特性的支持: 1.字符集 ... -
【Core Java】正则表达式
2012-04-05 23:40 01 -
【Core Java】类加载
2012-04-02 21:16 863主要内容包括: 1.类加载 / 类连接 / 类初始化 2. ... -
【****Core Java提纲****】
2012-04-02 18:54 827Java IO NIO Java并发编程 ... -
Java编程中“为了性能”尽量要做到的一些地方[zz]
2012-03-19 23:31 8501. 尽量在合适的场合使用单例 使用单例可以减轻 ... -
【Java并发】线程安全
2012-03-10 15:44 1057什么是线程安全? 当多个线程访问一个类时,如果不用考 ... -
【Java Socket】
2012-03-07 18:49 2712 -
各个rules里代码分析
2012-03-06 10:54 767InternalChannelRule private ... -
WXXR LRUList的实现
2012-03-01 16:01 779LRUList -
Apache LRUMap实现
2012-02-23 13:10 1126源码是 org.apache.commons.collect ... -
WXXR LRUMap的实现
2012-02-22 18:33 1890前言 实现LRU算法,注意观察者模式、并发(读写锁、线程池) ... -
【专题】LRU
2012-02-22 16:21 1533包含如下内容: 一. LRU算法 ht ... -
LRU理论
2012-02-21 18:46 10411.LRU算法介绍 LRU是Least Rec ... -
Eclipse Memory Analyzer使用指南
2012-02-21 18:42 1124参考 http://www.eclipse.org/ma ... -
【Java并发】锁
2012-02-20 14:04 3060简介 ...
相关推荐
`ConcurrentTaskScheduler`是另一个`TaskScheduler`实现,它使用`java.util.concurrent.Executor`实例来执行任务。与`ThreadPoolTaskScheduler`不同,它不支持精确的定时任务,而是依赖于`Executor`的并发特性来处理...
### Java Concurrency Framework 的介绍 #### 一、概述 本文档由 David Holmes 撰写,旨在为初学者提供一个关于 Java Concurrency Framework 的简单介绍。对于那些希望快速掌握 Java 并发编程基础概念的学习者来说...
<bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 配置核心线程数、最大线程数、队列容量等参数 --> <!-- application-context.xml --> ``` ### 2. ...
Separate the thread management from the rest of the application with the Executor framework Solve problems using a parallelized version of the divide and conquer paradigm with the Fork / Join ...
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心线程数 --> ${task.core_pool_size}" /> <!-- 最大线程数 --> ${task.max_pool_size}" /> <!--...
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.config.ScheduledTaskRegistrar; @Configuration @EnableScheduling @EnableAsync public ...
<bean id="taskExecutor" class="org.springframework.scheduled.concurrent.ThreadPoolTaskExecutor"> <!-- 这里可以注入需要的依赖 --> <task:executor id="executor" pool-size="5-10" /> ...
It’s a special kind of executor oriented to execute tasks that will be divided into smaller ones using the divide and conquer technique. Chapter 6, Concurrent Collections will teach the readers to ...
<bean id="scheduledExecutorFactoryBean" class="org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean"> ``` 4. **Quartz任务调度**: - 除了Spring内置的调度器,还可以...
<bean id="myScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"/> ``` 然后,你可以创建一个带有`@Component`和`@Scheduled`注解的类来定义任务: ```java import org....
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration public class ThreadPoolConfig { @Bean public ThreadPoolTaskExecutor threadPoolTaskExecutor() { ...
<property name="concurrent" value="false"/> <!-- Trigger 调度配置 --> <bean id="myTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <!-- 触发时间,单位为秒 --> ...
<bean id="myExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 配置线程池相关参数 --> <bean id="myScheduler" class="org.springframework.scheduling.concurrent...
<bean id="myScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> ``` 6. **Cron表达式** 如果需要更复杂的定时规则,可以使用Cron表达式,它允许我们定义基于日期和...
<property name="concurrent" value="false" /> ``` 这里,`jobExecutor`是包含`executeJob`方法的业务对象,`executeJob`是实际执行的任务逻辑。 在运行环境中,如MyEclipse 2016 1.0和JDK 1.8,这个小DEMO将...
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import com.chhliu.springboot.async.configuration.TaskThreadPoolConfig; @Configuration @EnableAsync public class ...
<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <bean id="scheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> ...
<bean id="myExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"/> <bean id="myScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"/> `...