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

来源:互联网 发布:淘宝卖高仿鞋的店铺 编辑:程序博客网 时间:2024/05/18 18:15

----------- 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次,写出程序。


原创粉丝点击