一、概念
线程:是一个程序里面不同的执行路径,每一个分支都叫线程。到现在为止我们所讲的程序分支只有一个,即main方法,称作主线程。
进程:class文件,exe文件。程序的执行过程:程序放入代码区(进程产生,准备开始执行,进程是静态的概念),平时所说的“进程的执行”是指进程中主线程(main)的执行,实际运行得都是线程。Windows Linux Unix操作系统是支持多进行、多线程的,Dos是只支持单进程的。一个时间点上一个cpu只有一个线程在执行,CPU很快,看起来像是同时运行。真正的多线程:多个CPU,双核。
二、线程的产生方式
实现Runable接口(建议使用此法)
要newThread对象来调用start方法启动线程,之后产生分支,主线程和分支线程并行执行;但是如果直接调用run方法,就是方法调用了,还是单线程。
通过继承java.lang.Thread
三、线程状态转换
start之后进入“就绪”,等待cpu时间片,时间片到达后进入“运行”,阻塞事件发生(如IO),事件解决则进入“就绪”
线程控制的基本方法:
就绪,运行,阻塞属于“活着”
优先级高,则分配的时间多
1、sleep静态方法,单位毫秒,抛异常(必须要写try catch)
重写的方法不能比父类抛出不同的异常,所以不能在run方法抛出异常。
在哪个线程调用sleep就是让这个线程睡眠,如第6行的sleep方法是让主线程睡眠。
而第8行是主线程睡眠10000ms后,来打断睡眠1000ms中的MyThread线程,导致该子线程抛异常。catch到异常后,该子线程结束。(Interrupt不是让子线程结束的好方法。stop更不好,尽量也不要使用),建议这样:
控制flag可以是run方法结束,run方法结束则线程结束。
2、join方法
第6行,join是合并两个线程,相当于方法调用。改程序先执行子线程,主线程再执行。
3、yeild。
下面程序有三条路径(main,t1,t2),每次到10的倍数则让出cpu。不经常用。
四、线程优先级(优先级高得到的cpu执行的时间片多)优先级范围1~10,默认是5。
t1的优先级高于t2
五、例子
1、同一个线程对象,用来启动两个线程
2、currentThread是当前线程(this是当前对象)