java线程有六种状态:NEW,TERMINATE,RUNNABLE和三种阻塞状态:WAITING,TIMED_WAITING,BLOCKED
首先,需要明确的是这六种状态是对应的java代码中的thread的状态,和真实存在于内核中的线程pcb状态有一定的关系,但是又和pcb的状态是完全区分开的两个东西
NEW :NEW状态指在java代码中已经创建了thread,但是这个thread还没有被start,也就是没有被内核创建pcb时的状态
public static void main(String []args){
Thread t1=new Thread(()->{
System.out.println("ti线程执行");
});
//没有调用start函数,此时线程为new状态
}
RUNNABLE:RUNNABLE状态表示java中的thread已经被创建了,且已经被start了,在内核中也有与thread对应的pcb被创建,并且这个pcb的状态是运行状态或者就绪状态;
public static void main(String []args){
Thread t1=new Thread(()->{
System.out.println("ti线程执行");
});
//调用了start,此时为runnable状态
t1.start();
}
TERMINATE:这个状态对应的是thred在内核的pcb已经完成了任务后,被销毁了,但是java中的thread对象并没有被释放,此时java为了表示这个对象的状态,就产生了这个TERMINATE这个状态
public static void main(String []args){
Thread t1=new Thread(()->{
System.out.println("ti线程执行");
});
//调用了start,此时为runnable状态
t1.start();
try {
//在哪个线程里面调用join,这个线程将会阻塞,直到调用join的线程对象的任务被执行完才会唤醒阻塞的线程
//此代码main和t1是两个线程,main线程里面的ti线程实例对象调用了join,main线程等待ti执行完,才会被唤醒
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//join后的代码被执行时,代表ti线程的任务已经被执行完
//此时线程的状态为terminated
}
从上面三个状态的描述可以看出,java中线程对象的状态不能和内核中的线程完全同步的创建和释放,所以在java内部需要对线程对象的状态有自己的描述,所以才产生java线程的状态
TIMED_WATING:这个状态指有时间限制的阻塞状态,就是这个线程的阻塞状态被要求维持一定的时间,这个状态就是由线程调用sleep(time)或者wati(time)方法来实现的,调用这个方法就会使线程阻塞time的时长;
public static void main(String []args){
Thread t1=new Thread(()->{
System.out.println("ti线程执行");
try {
t1.sleep(1000);
//执行完sleep()的线程状态为timedwaiting状态
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t1.start();
}
BLOCKED:这个状态是当两个线程都要访问一个被加锁(被synchronized修饰)的方法或者代码块时产生的,先访问的这个方法的线程可以访问到这个方法并运行,后来的线程需要判断是否这个被加锁的方法有线程在调用,如果是就要进入BLOCKED状态,当先来的线程执行完加锁的方法后才会唤醒这个Blocked状态的进程
synchronized public void func(){
//被synchronized修饰的方法
System.out.println("synchronized方法调用");
}
public static void main(String []args){
Thread t1=new Thread(()->{
while(true){
func();
System.out.println("t2线程执行");
}
});
Thread t2=new Thread(()->{
while(true){
func();
System.out.println("t2线程执行");
}
});
//调用了start,此时为runnable状态
t1.start();
t2.start();
//由于t1,t2两个线程一直在循环执行,总有一次两个线程都同时在调用func(),此时谁后调用,谁就切换为bolcked状态
}
WAITING:调用wait()方法且不在括号内传入时间参数,此时线程的状态就会被切换为waiting状态,会一直等待,直到notify()唤醒这个线程