1. Java创建线程,Runnable和Callable都是一个任务的概念,而不是线程,线程是Thread类,我们将一个Runnable和Callable的任务对象传递给Thread去执行,Thread再去调用该对象的run方法。
2. 为什么大家都推荐用任务对象来创建多线程,原因为一个runnable对象可以传递给多个Thread,可以达到数据共享,我当时看到就纳闷有static也是可以的嘛,后面查资料才发现是static的对象生命周期与类同在啊,有可能子Thread跑完了,这些static还存在着,多浪费啊。其实这还有另外一个好处就是组合和继承,大家稍微抽象的遐想一下。
3.Callable和Runnable的主要区别在于Callable可以有返回值,然后被收集到Future对象中。
4.Executors.newFixedThreadPool:固定大小的线程池,多余的再等待队列中等着。
Executors.newCachedThreadPool:不停的网上累加线程,但是每个线程有缓存60秒的时间,有缓存则不创建。
newSingleThreadPool,一个线程处理,保证所有线程的顺序执行。
顺便来讲讲以前看过的Volatile吧,他只保证了数据是直接与内存同步读与写的,i++,是说的i直接存内存读出,i也是直接写入内存中的。
而i++是三步操作,tmp = i; tmp = tmp + 1; i= tmp;,volatile只能保证i拿到的直接是内存中的值,写也是直接写入内存,可以立即给其他线程看到。但是第二步是无法保证原子性的。
还有一个特性提及一下,volatile可以避免指令重排,有兴趣的可以去深入看看java内存模型和内存屏障神马的。
再来一个知识点:32位的整形变量是原子的,但是64位会被32位系统拆分成俩个,但是说是这么说,大部分系统还是保障了64位的原子性。
原子操作有哪些内:read,load(载入),use(使用),assign(赋值),store(存储),write,lock,unlock,其中read,write,lock,unlock是主内存上的操作,而剩下的CPU的工作内存,后面又添加了一些原子操作,CAS神马的,每次看过都不记得了,忧桑。。。。