参考文章: http://lavasoft.blog.51cto.com/62575/27069/
文章已经总结的很详细,我以下的文章只是对上面文章的简单摘抄,版权仍然为上文所有。
1、 java线程的概念
参考链接: http://lavasoft.blog.51cto.com/62575/27069/
线程创建的两种方法:继承thread类和实现runnable方法。
如果是扩展java.lang.Thread类的线程,则直接new即可。
如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
Thread(Runnabletarget)
Thread(Runnabletarget, String name)
Thread(ThreadGroupgroup, Runnable target)
Thread(ThreadGroupgroup, Runnable target, String name)
Thread(ThreadGroupgroup, Runnable target, String name, long stackSize)
获取当前线程的对象的方法是:Thread.currentThread();
一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说,调度程序不能保证其执行次序,持续时间也无法保证。
2、 线程栈模型
线程被调用进入run方法后,将调用一个新的栈继续运行。
3、 java线程的状态转换
1、新状态:线程对象已经创建,还没有在其上调用start()方法。
2)、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。
3)、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
4)、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。比如经常碰到的有I/O阻塞、sleep(sleep结束后是进入可运行的状态,需要等调度进入运行状态,所以程序正在的sleep时间最少是设置的休眠时间)、yield方法(暂停当前正在执行的线程对象,并执行其他的线程)和join方法(让线程B加入到另外一个线程A的尾部,在A执行完毕之前B不能工作)。
5)、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
4、 线程的同步与锁
可以参考笔记《synchronized相关》
关于同步,可以同步方法也可以同步代码块
5、 线程的交互
线程之前如果需要按照顺序进行交互,则可以使用wait() 和 notify()或者 notifyAll() 来控制。
wait()还有另外两个重载方法:
voidwait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
voidwait(long timeout, int nanos)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
Notifyall():
6、 线程池:
使用线程池的必要性:
如果每次获取一个线程都去newThread的弊端如下:
a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。