黑马程序员 – 学习Java5线程并发库(4) -- 2013.1.2

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


今天学习了一种设计方法,实现对ThreadLocal变量的封装,让外界不要直接操作ThreadLocal变量。

1. 对基本类型的数据进行封装,相对少见。

2. 对对象类型的封装,比较常见,既让某个类针对不同线程分别创建一个独立的实例对象。

 

学习总结了多个线程访问共享变量的方式,并且针对一道面试题都实现了。

1. 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据以及操作共享数据的方法。比如买票系统就可以这么做。

2. 如果每个线程执行的代码不同,这时需要不同的Runnable对象,有两种方式可以实现。

① 将共享变量及操作共享变量的方法封装在一个对象里,再把对象传递给各个Runnable对象。

② 将共享变量和操作共享变量的方法定义在一个外部类中,把Runnable对象作为内部类。Runnable对象里的run方法调用外部类中的操作共享变量的方法。

 

还有第三种方式就是把上面两种方式组合起来,把共享变量及操作变量的方法都封装在一个对象里,把Runnable对象作为内部类,调用封装对象里的操作变量的方法。总之,要同步互斥的几段代码最好是放在几个独立的方法中。

 

关于线程池的内容在前面已有所了解,今天比较系统地回顾了一遍。学习了新内容:Callable和Future。Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的。用来提交一组Callable任务的是CompletionService,其take方法返回最先完成的一个Callable任务对应的Future对象。

 

附:面试题

设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,共100次,写出程序。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值