java.util.concurrent.ExecutorService:
Some implementations classes are as listed:
- AbstractExecutorService
- ThreadPoolExecutor
- ScheduledThreadPoolExecutor
So what can there implementation could do are as follows:
- To execute some particular Runable thread
- To execute some particular Callable object
- ExecutorService's method can return some usefull value
but traditional normal thread.start() hasn't return value
- You can choose submit() / invokeAll() / invokeAny()
- ArrayBlockingQueue :一个由数组支持的有界队列。
- LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
- PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
- DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
- SynchronousQueue :一个利用 BlockingQueue接口的简单聚集(rendezvous)机制。
java.util.concurrent.ThreadPoolExecutor
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime:线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位 [TimeUnit ]
workQueue:线程池所使用的缓冲队列
[BlockingQueue {LinkedBlockingQueue || ArrayBlockingQueue}]
handler: 线程池对拒绝任务的处理策略 [RejectedExecutionHandler ]
一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个
Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,
也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,
那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,
并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池
中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
也就是:处理任务的优先级为:
核心线程corePoolSize、
任务队列workQueue、
最大线程maximumPoolSize,
如果三者都满了,使用handler处理被拒绝的任务。
当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过
keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
- NANOSECONDS、
- MICROSECONDS、
- MILLISECONDS、
- SECONDS。
handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务
----------------------------------------------------------------------
public interface IAction{
String SUCCESS = "success";
String FAILURE = "failure";
String EXCEPTION = "Exception";
public static enum Action{
SUCCESS(IAction.SUCCESS){
@Override
public String responseToClient(){
// Do some process
return IAction.SUCCESS;
}
},
FAILURE(IAction.FAILURE){
@Override
public String responseToClient(){
// Do some process
return IAction.FAILURE;
}
},
EXCEPTION(IAction.EXCEPTION){
@Override
public String responseToClient(){
// Do some process
return IAction.EXCEPTION;
}
};
String actionName;
Action(String actionName){
this.actionName = actionName;
}
abstract String responseToClient();
}
}
Callable<String> cal = new Callable<String>(){
public String call() {
System.out.println("Logic processing in a callable ...");
try{
Thread.sleep(500);
}catch(InterruptedException iE){
Action.valueOf(ActionResults.EXCEPTION)
.responseToClient();
return ActionResults.EXCEPTION;
}
Action.valueOf(ActionResults.SUCCESS)
.responseToClient();
return ActionResults.SUCCESS;
}
};
FutureTask<String> ft = new FutureTask<String>(cal);
try {
new Thread(ft).start();
System.out.println("Outer the callable ...");
System.out.println(ft.get());
} catch (InterruptedException iE) {
} catch (ExecutionException eE) {
}
----------------------------------------------------------------------
Independant code snippets,与上无关
public void run() {
try {
while (true) {
synchronized (workpile) {
while (workpile.empty())
workpile.wait();
request = workpile.remove();
}
server.process(request);
}
}catch (InterruptedException e)
}