Executor框架

2016-08-16  本文已影响319人  全栈未遂工程师

Java的线程既是工作单元,也是执行机制。JDK5开始,把工作单元和执行机制分离开,工作单元包括RunnableCallable,而执行机制由Executor框架提供。

Executor框架简介

Executor框架的结构和成员

public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
* `SingleThreadExecutor`:创建单个线程。
public static ExecutorService newSingleThreadExecutor()
* `CachedThreadPool`:大小无界的线程池,适用于执行很多的短期异步任务的小程序,或者是负载较轻的服务器。

corePoolSize为0,maximumPoolSizeInteger.MAX_VALUE,工作队列为SynchronousQueue。会出现极端情况,即用户提交任务速度高于线程处理任务速度,会不断的创建新线程,直到耗尽CPU和内存。每个线程在结束任务60s之后,会被终止。

public static Callable<Object> callable(Runnable task)
//当任务执行结束,Future.get()得到null
public static <T> Callable<T> callable(Runnable task, T result))
//当任务执行结束,Future.get()得到result对象。

ScheduledThreadPoolExecutor 详解

主要用来在给定的延迟之后运行任务,或者定期执行任务。ScheduledThreadPoolExecutor的功能和Timer类似,但ScheduledThreadPoolExecutor功能更强大灵活,对应过个后台线程,Timer对应的是单个后台线程。

运行机制

ScheduleFutureTask主要包含3个成员变量:

FutureTask详解

Future接口和实现Future接口的FutureTask类,代表异步计算的结果。

FutureTask的使用

可以把FutureTask交给Executor执行;也可以通过ExecutorService.submit(...)方法返回一个FutureTask,然后执行FutureTask.get()方法或者FutureTask.cancel(...)方法。除此以外,还可以单独使用FutureTask

package com.future;

import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

public class TutureTaskTest {
    private final ConcurrentMap<Object, Future<String>> taskCache = new ConcurrentHashMap<Object, Future<String>>();
    private String executionTask(final String taskName) throws ExecutionException, InterruptedException{
        while(true){
            Future<String> future = taskCache.get(taskName);
            if(future == null){//没有该任务
                Callable<String> task = new Callable<String>(){
                    @Override
                    public String call() throws Exception {
                        return taskName;
                    }
                };
                //创建任务
                FutureTask<String> futureTask = new FutureTask<String>(task);
                future = taskCache.putIfAbsent(taskName, futureTask);//如果这个key不存在就put返回null,否则不put并返回以前的值。
                if(future == null){//put成功返回null
                    future = futureTask;
                    futureTask.run();//此次新添加了这个任务,执行这个任务
                }
            }
            try{
                return future.get();//等待该线程执行完任务之后返回
            }catch(CancellationException e){
                taskCache.remove(taskName, future);
            }
        }
    }
    public static void main(String[] args) {
        
    }
}
上一篇 下一篇

猜你喜欢

热点阅读