runoob.com,多线程编程( 二 )


需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存的回收速度;protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的 。
这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次 。ThreadLocal中的缺省实现直接返回一个null 。2.ThreadLocal底层实现原理:ThreadLocal通过Thread.currentThread();获取当前线程操作map集合:ThreadLocalMapvoid set(Object value)就是Map.put(“当前线程”,值);public Object get()就是获取ThreadLocalMap然后操作后返回 。
五、线程池1.为什么要使用线程池?因为要通过线程池来管理线程,启动或者停止一个线程非常耗费资源,所以将线程交给线程池来管理能够节约内存 。一般在企业开发当中我们都使用线程池,通过spring去整合线程池,异步注解 。2.什么是线程池?线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程 。
线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求 。然而,增加可用线程数量是可能的 。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到池子中并等待下一次分配任务 。3.线程池作用:基于以下几个原因,在多线程应用程序中使用线程池是必须的:1.线程池改进了一个应用程序的相应时间 。由于线程池中的线程已经准备好且等待被分配任务,应用程序可以直接拿来使用而不用新建一个线程 。
2.线程池节省了CLR为每个短生命周期任务创建一个完整的线程开销并可以在任务完成后回收资源 。3.线程池根据当前在系统中运行的进程来优化线程时间片 。4.线程池允许我们开启多个任务而不用为每个线程设置属性 。5.线程池允许我们为正在执行任务的程序参数传递一个包含状态信息的对象引用 。6.线程池可以用来解决处理一个特定请求最大线程数量限制问题 。
4.线程池四种创建方式:java通过Executors(jdk1.5的并发包)提供四种线程池,分别为:1.newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程 。2.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 。
3.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行4.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行 。总结:newCachedThreadPool 创建的线程,线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程 。
Java初学有必要深入多线程编程吗,如何学习?

runoob.com,多线程编程


多线程作为JAVA学习的主要难点之一,有开发复杂,出现问题难以复现等特性,但却是不得不掌握的知识点,因为JAVA中使用多线程的场景实在是太多了 。先看下多线程(所有语言)的发展背景:早期的计算器都是单核CPU,想要获得更高的性能只能是扩展硬件(摩尔定律),但是很快硬件的发展达到了瓶颈,要提高计算能力只能是横向扩展(增加计算机CPU核心,现在也没有单核心的计算机了吧),因为一个CPU在同一个时间点上只能处理一个线程,现在的服务器少则16核,如果使用单线程编程,相当于你只用了1/16的CPU资源,暴殄天物!所以多线程是很有必要学习的 。

推荐阅读