您的位置:首页 > 其它

线程系列(四)--浅说高层并发

2016-06-16 14:39 302 查看
对于高级任务的并发,需要高层并发对象来充分利用多处理器和多核的大规模并发应用。主要在包java.util.concurrent。

锁Lock

Created with Raphaël 2.1.0接口LockReentrantLock

public interface Lock {
//用来获取锁。如果锁是不可用则线程等待直到获取到锁。
void lock();
/**
//如果当前线程没有被中断获取锁。
//如果锁是可用的,请求锁并马上返回;如果锁不可用,当前线程就不能完成线程调度,然后开始休眠直到当前线程获取锁成功或响应被另一个线程中断。
//如果当前线程在这个方法里设置它的中断状态,或者在获取锁的时候当前线程响应了中断锁的请求,就会抛出中断异常InterruptedException清除当前线程的中断状态。
*/
void lockInterruptibly() throws InterruptedException;
/**
//只要在调用这个方法的时候是自由的就请求锁。
//如果锁是可用的,请求锁并马上返回true;如果不可用直接返回false。
//这个方法的经典使用例子如下,这种使用可以确保在请求到锁时锁被释放,没有请求到锁时不会去试图释放锁。
Lock lock = ...;
if (lock.tryLock()) {
try {
// manipulate protected state
} finally {
lock.unlock();
}
} else {
// perform alternative actions
}}
*/
boolean tryLock();
/**
//在给定时间里当前线程是自由的并且没有被中断就请求锁。
//如果锁是可用的,请求锁并马上返回true;如果不可用当前线程就不能达到调度线程目的,然后开始休眠直到当前线程获取到锁或者其他线程中断了它,再或者到了指定的时间。
//中断异常抛出情况同lockInterruptibly()
*/
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unLock();//释放锁
Condition newCondition();//返回一个绑定这个锁的条件实例
}


Created with Raphaël 2.1.0接口ReadWriteLockReentrantReadWriteLock

public interface ReadWriteLock {
/**
* 返回用于读的锁
*/
Lock readLock();

/**
* 返回用于写的锁
*/
Lock writeLock();
}


线程池

1.Executors

使用静态工厂方法生成一些常用线程池

public class Executors {
/**
* nThread:线程池的线程个数
* threadFactory:当创建新的线程时使用的工厂,下面每个方法都有个重载方法,少了这个参数,当没有此参数时为默认工厂defaultThreadFactory()提供。
*/
//创建使用固定大小线程池的执行器。
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),threadFactory);
}
}
//创建使用可扩展的线程池的执行器,适合执行大量短时任务
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),threadFactory);
}
//创建一个一次执行一个任务的执行器。
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),threadFactory));
}
//创建一个默认线程工厂
public static ThreadFactory defaultThreadFactory() {
return new DefaultThreadFactory();
}


Created with Raphaël 2.1.0ExecutorExecutorServiceAdstractExecutorServiceThreadPoolExecutor

2.Executor

用来运行提交的任务栈的简单接口。

public interface Executor {

/**
* 在将来某个时刻运行这些给定的命令行。
* 这个命令可能运行在一个新的线程或者一个线程池再或者一个调用它的线程里, 由Executor得实例处理。
* @param command 任务栈
* @throws RejectedExecutionException 如果这个任务不能被运行就会抛出
* @throws NullPointerException 如果command为null抛出
*/
void execute(Runnable command);
}


3.ExecutorService

在Executor基础上增加一些方法来管理生命周期,管理执行器关闭。

public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();//如果这个executor被关闭就返回true
boolean isTerminated();
<T> Future<T> submit(...);
<T> List<Future<T>> invokeAll(...);
}


AdstractExecutorService是ExecutorService的一种默认实现

4.ExecutorPoolExecutor

线程池刚创建时里面是没有线程的,需提交任务才会创建线程,也可调用特定方法立即创建。

public class ThreadPoolExecutor extends AbstractExecutorService {
/**
* 有四个重载的构造方法,这是参数最多的一个。
* corePoolSize:核心池大小,线程数目大于这个数时提交的任务就会被放进缓存队列。
* maximumPoolSize:线程池最大线程数,可动态调整。
* keepAliveTime:线程无任务执行时最多保持多久时间终止。当线程数大于corePoolSize时或给核心线程池的线程设时间时才会起作用。
* unit:time的时间单位,有七种,如TimeUnit.DAYS
* workQueue:缓存队列,存储等待执行的任务,一般选LinkedBlockingQueue或Synchronous。
* threadFactory:线程工厂,用来创建线程。
* handler:当拒绝处理任务时的策略,4种取值。
* 若当前线程数<corePoolSize,就每来一个任务创建一个线程;
* 若当前线程数>=corePoolSize,就尝试将任务加入BlockingQueue,如果加入失败一般来说就是缓存队列已满,那就再创建新线程。
* 若当前线程数>maximumPoolSize,就会采取任务拒绝策略来处理。
*/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
}
//线程池的运行状态
private static final int RUNNING    = -1 << COUNT_BITS; //创建线程初始时。
private static final int SHUTDOWN   =  0 << COUNT_BITS;//调用shutDown()时,此时线程池不接受新任务,会等待所有任务执行完毕。
private static final int STOP       =  1 << COUNT_BITS;//调用shutDownNow()时,此时线程池不接受新任务,并且会尝试终止正在执行的任务。
private static final int TIDYING    =  2 << COUNT_BITS;//
private static final int TERMINATED =  3 << COUNT_BITS;//当线程处于SHUTDOWN和STOP状态,所有工程线程销毁,任务缓存队列也清空或结束时。
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程