高级线程开发(线程池、资源封锁和队列)
2013-09-08 22:09
225 查看
转自:http://my.oschina.net/dxf/blog/239
jdk1.5后,提供了java.util.concurrent包,它可以实现线程池,你把线程当成普通对象就可以了,它来负责调度和执行
包括两类线程池
固定线程池
可变线程池
延迟线程池
固定线程池
public static ExecutorService newFixedThreadPool(int nThreads) 多任务
public static ExecutorService newSingleThreadPool() 单任务
ExecutorService 的方法
Excute(Runnablecommand);
shutdown();
用法如下
Mytask mt1=new Mytask("T1");//一个线程对象实例
ExecutorService threadpool=Executors.newFixedThreadPool(2);
threadpool.excute(mt1);
可变线程池
public static ExecutorService newCachedThreadPool()
延迟线程池,实现定时任务
public static ScheduledExecutorService newScheduledThreadPool(int poolSize)
它不使用excute方法了,而是使用schedule方法
public SchedualedFuture schedule(Runnable command,long delay,TimeUnit unit);
有返回值的线程池
Callable接口配合Future接口,Future接口用来接受返回值
Callable接口作用同runnable接口,不过它是实现call接口方法,这个方法还有返回值
class myCallableImpl implements Callable
{
public Object call()<
4000
/p>
{
}
}
使用
ExecutorService threadpool =Executors.newSingleThreadExector();
Future f=threadpool.submit(new myCallableImpl();
资源封锁
前面我们知道syncnized方法可以对一段代码进行资源封锁,实际上还有很多其他方法,这里总结一下
1:synchronized
2:变量volatile
3:lock接口的实现 ReentrantLock类,它有方法:lock()、unlock(),tryLock()等,注意要try……finally,防止死锁
4:ReadWriteLock接口实现 ReentrantReadWriteLock类,方法为readLock,writeLock,使用方法大致同lock接口,不过它的效率高。也要防止死锁
5:信号量 Semaphore类,信号量不同于锁,是用来实现资源分配的,但是也有锁的特性,比如连接池,保证连接池不爆炸就可以使用这个类,主要方法为:acquire(),acquire(int n),tryAcquire(),getQueueLength(),release()
6:原子对象,在jdk15后,为了简化操作,可以把一些基本类型定义为原子对象,就单线程操作了。java.util.concurrent.atomic ,作用基本同变量volatile
7:障碍器,CyclicBarrier类,让线程同步到同一个点
队列和堆栈
java.util.Queue接口
public boolean offer(Object); 加入
public Object poll(); 出
peek(); 出,但是不删除
remove();同poll
element();同peek
add();同offer
常见实现为:java.util.LinkedList 和 java.util.PriorityQueue
BlockingQueue接口
java.util.concurrent.BlockingQueue
put(Object);进
take();出
BlockingDeque接口
它是一个阻塞的堆栈接口
putFirst(object o);
takeFirst();
putLast();
takeLast();
jdk1.5后,提供了java.util.concurrent包,它可以实现线程池,你把线程当成普通对象就可以了,它来负责调度和执行
包括两类线程池
固定线程池
可变线程池
延迟线程池
固定线程池
public static ExecutorService newFixedThreadPool(int nThreads) 多任务
public static ExecutorService newSingleThreadPool() 单任务
ExecutorService 的方法
Excute(Runnablecommand);
shutdown();
用法如下
Mytask mt1=new Mytask("T1");//一个线程对象实例
ExecutorService threadpool=Executors.newFixedThreadPool(2);
threadpool.excute(mt1);
可变线程池
public static ExecutorService newCachedThreadPool()
延迟线程池,实现定时任务
public static ScheduledExecutorService newScheduledThreadPool(int poolSize)
它不使用excute方法了,而是使用schedule方法
public SchedualedFuture schedule(Runnable command,long delay,TimeUnit unit);
有返回值的线程池
Callable接口配合Future接口,Future接口用来接受返回值
Callable接口作用同runnable接口,不过它是实现call接口方法,这个方法还有返回值
class myCallableImpl implements Callable
{
public Object call()<
4000
/p>
{
}
}
使用
ExecutorService threadpool =Executors.newSingleThreadExector();
Future f=threadpool.submit(new myCallableImpl();
资源封锁
前面我们知道syncnized方法可以对一段代码进行资源封锁,实际上还有很多其他方法,这里总结一下
1:synchronized
2:变量volatile
3:lock接口的实现 ReentrantLock类,它有方法:lock()、unlock(),tryLock()等,注意要try……finally,防止死锁
4:ReadWriteLock接口实现 ReentrantReadWriteLock类,方法为readLock,writeLock,使用方法大致同lock接口,不过它的效率高。也要防止死锁
5:信号量 Semaphore类,信号量不同于锁,是用来实现资源分配的,但是也有锁的特性,比如连接池,保证连接池不爆炸就可以使用这个类,主要方法为:acquire(),acquire(int n),tryAcquire(),getQueueLength(),release()
6:原子对象,在jdk15后,为了简化操作,可以把一些基本类型定义为原子对象,就单线程操作了。java.util.concurrent.atomic ,作用基本同变量volatile
7:障碍器,CyclicBarrier类,让线程同步到同一个点
队列和堆栈
java.util.Queue接口
public boolean offer(Object); 加入
public Object poll(); 出
peek(); 出,但是不删除
remove();同poll
element();同peek
add();同offer
常见实现为:java.util.LinkedList 和 java.util.PriorityQueue
BlockingQueue接口
java.util.concurrent.BlockingQueue
put(Object);进
take();出
BlockingDeque接口
它是一个阻塞的堆栈接口
putFirst(object o);
takeFirst();
putLast();
takeLast();
相关文章推荐
- 高级线程开发(线程池、资源封锁和队列)
- 高级线程开发(线程池、资源封锁和队列)
- 高级线程开发(线程池、资源封锁和队列)
- concurrent包 线程池、资源封锁和队列、ReentrantReadWriteLock介绍
- 多线程并发库高级应用 之 java5中的线程并发库--线程池、Callable&Future
- 线程的相关讨论--(1)线程池与工作队列
- java实现线程池,实现线程队列(转)
- Android开发进阶—线程和线程池
- 【读书笔记】【Android 开发艺术探索】第11章Android 的线程和线程池
- 线程高级应用-心得7-java5线程并发库中阻塞队列Condition的应用及案例分析
- IOS高级开发~底层实现资源收集
- Android官方开发文档Training系列课程中文版:线程执行操作之线程池操作
- 使用 线程池,控制线程 , 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待:
- 谷歌电子市场开发流程(9)-线程,线程池
- (四)juc线程高级特性——线程池 / 线程调度 / ForkJoinPool
- 高级线程之线程池
- 【高级线程管理】线程池
- 使用队列和线程对现有asp.net动态页处理进行资源控制
- java.jse-线程-线程池-java自带线程池和队列详细讲解
- IOS高级开发~底层实现资源收集