在单CPU的计算机中,其实并没有真正的并行,它只不过是CPU时间钟快速轮转调度给你的错觉。,而这种错觉让你产生了他们真的在同一时刻同事运行。
对计算机来说每一个任务就是一个进程。即task为一个进程。
创建一个线程,并且重写其run方法,将enjoyMusic交给他执行。
启动新的线程,只有调用了Thread的start方法,才代表派生出了一个新的线程。
每个线程都有自己的局部变量b表、程序计数器、以及生命周期
查看线程的工具:jdk自带的Jconsole
NEW :新建
RUNNBALE:就绪
RUNNING:运行
BLOCKED:阻塞
TERMINATED:结束(死亡)
其中:
NEW状态通过 start方法进入RUNNABLE状态;
RUNNABLE状态必须调用start方法;
线程一经启动就可以立即得到执行么?答案是否定的。
中间的状态叫可执行状态(RUNNABLE),就是说他具备执行的资格,但是并没有真正的执行起来而是等待CPU的调度。
通过轮训或者其他方式从任务可执行队列中选中了线程,
进入BLOCKED状态,比如调用了sleep,或者外套方法而加入了waitSet中。
线程中,run方法是被JNI的方法start()调用的。
Thread被构造后的NEW状态,事实上threadStatus这个内部属性为0;
不能两次启动Thread,否则就会出现IllegalThreadStateException异常。
线程启动后将会被加入到一个ThreadGroup中
一个线程生命周期结束,也就是到了TERMINATED状态,再次调用start方法是不允许的。
第一个是重复启动,只是第二次启动时不允许的,而第二次企图重新激活也是抛出了非法状态的异常,但是此时没有线程,因为该线程的生命周期已经被终结。
创建线程只有一种凡是那就是构造Thread类,而实现线程的执行单元则有两种方式,第一种是重写Thread的run方法,第二种是实现Runnable 接口的run方法。
线程生命周期需要一幅图:
待做(· 。·);
线程默认命名:
线程会以“Thread-”开始,然后和数字组合;
eg:
Thread-0
Thread-2
Thread-1
Thread-3
命名线程:
Thread(Runnable target,String name)name代表线程名;
Thread(String name)name代表线程名;
线程一旦启动名字不能被改。
线程的父子关系:
新创建的任何一个线程都会有一个父线程。
一个线程的创建肯定是由另一个线程完成的。
被创建线程的父线程是创建它的线程。main函数所在的线程是由jvm创建,也就是main线程。父线程都是main线程。
ThreadGroup:
main所在的ThreadGroup称其为main。