java线程问题(待完善)

来源:互联网 发布:方维o2o 6.0 源码 编辑:程序博客网 时间:2024/05/21 07:06

  不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。

  在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像在Java并发编程的过程中遇到了什么挑战,Java内存模型,JDK1.5引入了哪些更高阶的并发工具,并发编程常用的设计模式,经典多线程问题如生产者消费者,哲学家就餐,读写器或者简单的有界缓冲区问题。仅仅知道线程的基本概念是远远不够的, 你必须知道如何处理死锁,竞态条件,内存冲突和线程安全等并发问题。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。

1.1 简介

  线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。

  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。
  假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。

  线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目,比如:
  假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。

1.2 线程池优点

第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。

第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

1.3常用的创建线程池的静态方法:

这里写图片描述

解释如下:
创建一个可重复使用一定数量线程的线程池,这些线程是在一个共享的无限制的队列中运行的。无论何时何地,最多有nThread个线程可以变为激活(active)状态的正在运行的任务task。如果当所有的线程都变为激活(active)状态时,有额外的任务task提交了,这些新加的任务task将在队列(queue)中等待,指导有一个线程(Thread)可用(available)了。如果由于在运行期间的一个失误导致任意线程(Thread)以shutdown方法终止了,一个新的线程将会被创建出来用来执行后续任务(task(s)).这些线程将一直在池中存在,除非明确地使用ExecutorService的shutdown()将它们终止。
因此,从官网的可以看出这个方法创建出的线程池是不是定时的,而且也不能周期性执行
还有个可以延时且周期性执行的线程池的创建方法如下:
jdk1.7的解释:
/**
* Creates a thread pool that can schedule commands to run after a
* given delay, or to execute periodically.
* @param corePoolSize the number of threads to keep in the pool,
* even if they are idle.
* @return a newly created scheduled thread pool
* @throws IllegalArgumentException if {@code corePoolSize < 0}
*/
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
这个静态方法 Executors.newScheduledThreadPool(int corePoolSize)意思如下:
创建一个线程池,它可以安排命令(commands)在给定的延时时间段后才开始执行,或者这个线程池也可以周期性地执行。corePoolSize是在池中保留的线程数,这些线程可以是出于空闲状态下(idle)。

如上两个是常用的常见线程池的静态方法,他们都是用Executors的静态方法。

相关线程类的关系图如下:
这里写图片描述

参考文档

http://www.importnew.com/12773.html
http://www.cnblogs.com/Eason-S/p/5721296.html
http://blog.csdn.net/caihaijiang/article/details/30812293
http://www.importnew.com/21089.html
http://blog.csdn.net/sd0902/article/details/8395677
http://www.cnblogs.com/lucky_dai/p/5505222.html
http://www.cnblogs.com/ningxu/p/3478911.html

原创粉丝点击