线程知识小结一
一、线程的创建
1.继承Thread类创建多线程
定义Thread类的子类,重写Thread类的run()方法,创建该子类的实例对象,调用对象的start()方法
2.实现Runnable接口创建多线程
定义一个实现Runnable接口的类并实现run()方法,创建该类的实例对象,将其作为参数传递给Thread类的构造方法来创建Thread对象,调用Thread对象的start()方法
两种方式的对比:
继承Thread类创建的多个线程不会共享同一资源而通过实现Runnable接口创建多个线程是共享同一资源的。
方法2的好处:
1)适合多个相同的程序代码的线程去处理同一个资源的情况,把线程同程序代码、数据有效的分离,很好的体现了面向对象的设计思想
2)可以避免由于java的单继承带来的局限性。就是使用一个已经继承了某一个类的子类创建线程,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式。
后台线程:
对java程序来说,只要还有一个前台线程在运行,这个进程就不会结束,如果一个进程中只有后台线程运行,这个进程就会结束。新建的线程都是默认为前台线程
设置线程为后台线程的方法:在线程对象启动之前调用setDaemon(true),也就是说setDaemon()必须在start()之前调用,否则会引发IllegalThreadStateException异常
二、线程的生命周期
需要注意的是:线程从阻塞状态只能进入就绪状态,而不能直接进入运行状态,也就是说结束阻塞的线程需要重新进入到可运行池中,等待线程的调度