JDK 1.5 使用java.util.concurrent 开发并发应用

简单的并发应用

JDK 1.5 API 中增加了新的包.

java.util.concurrent 在并发编程中很常用的实用工具类。
java.util.concurrent.locks 为锁定和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。

此包下的类图

常用的类 :

Executors 提供建立线程池或线程工厂的方法.

ExecutorService 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。

Executor 可以简单理解为一个线程的执行者.

Future 表示异步计算的结果,对执行的线程的状态检查,可以获得执行结果.

FutureTask 此类提供了对 Future 的基本实现,可使用 FutureTask 包装Callable 或Runnable对象。所以可将 FutureTask 提交给Executor 执行。

Callable 线程要执行而去实现的接口

Semaphore 一个计数信号量,通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。

更加详细类说明和方法的应用,请可以查阅API

以下是简单的例子 :

(限制并发线程数量)

  1. public static void main(String[]args){
  2. //线程池
  3. ExecutorServiceexec=Executors.newCachedThreadPool();
  4. //只能5个线程同时访问
  5. final Semaphoresemp= new Semaphore( 5 );
  6. //模拟20个客户端访问
  7. for ( int index= 0 ;index< 20 ;index++){
  8. final int NO=index;
  9. Runnablerun= new Runnable(){
  10. public void run(){
  11. try {
  12. //获取许可
  13. semp.acquire();
  14. System.out.println( "thread:" +NO);
  15. Thread.sleep(( long )(Math.random()* 1000 ));
  16. //访问完后,释放
  17. semp.release();
  18. } catch (InterruptedExceptione){
  19. }
  20. }
  21. };
  22. exec.execute(run);
  23. }
  24. //退出线程池
  25. exec.shutdown();
  26. }

简单的线程池管理类:

  1. import java.util.concurrent.Callable;
  2. import java.util.concurrent.ExecutionException;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.Future;
  6. import java.util.concurrent.FutureTask;
  7. import java.util.concurrent.Semaphore;
  8. /**
  9. *线程池的管理类
  10. *通过静态方法获得此类的实例
  11. */
  12. public class ThreadPoolManager<T>{
  13. private ExecutorServiceservice= null ;
  14. private final Semaphoresemp;
  15. private int maxNum= 3 ;
  16. private static ThreadPoolManagerme= null ;
  17. public static ThreadPoolManagergetInstance(){
  18. if (me== null ){
  19. me= new ThreadPoolManager();
  20. }
  21. return me;
  22. }
  23. public static ThreadPoolManagergetInstance( int maxNum){
  24. if (me== null ){
  25. me= new ThreadPoolManager(maxNum);
  26. }
  27. return me;
  28. }
  29. private ThreadPoolManager(){
  30. service=Executors.newCachedThreadPool();
  31. semp= new Semaphore(maxNum);
  32. }
  33. private ThreadPoolManager( int maxNum){
  34. this .maxNum=maxNum;
  35. service=Executors.newCachedThreadPool();
  36. semp= new Semaphore(maxNum);
  37. }
  38. /**
  39. *执行线程任务,返回结果.
  40. *如果线程池数量全部占用,则此线程阻塞.
  41. *线程运行的传入参数类的实现方法.
  42. *@paramtask实现java.util.concurrent.Callable接口的类
  43. *@return返回线程运行的结果
  44. *@throwsInterruptedException
  45. *@throwsExecutionException
  46. */
  47. public TrunTask(Callable<T>task) throws InterruptedException,ExecutionException{
  48. semp.acquire(); //使用信号标记,如果超过个数会造成线程阻塞
  49. Future<T>f=service.submit(task); //加载线程任务,并且执行
  50. semp.release(); //信号释放
  51. return f.get(); //返回线程处理的结果,如果此线程尚未处理完成,则线程阻塞直到返回结果
  52. }
  53. /**
  54. *@return返回线程可用数量
  55. */
  56. public synchronized int getavailableNum(){
  57. return this .semp.availablePermits();
  58. }
  59. /**
  60. *关闭线程池
  61. */
  62. public final void close(){
  63. service.shutdown();
  64. }
  65. }

博文来源:http://ajava.org/course/java/12954.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值