目录
NEW(新建状态)
线程刚被创建,但是并未启动。还没调用start方法。
public class New {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
}
});
//获取当前线程的状态 getState()
System.out.println(t.getState()); //NEW 状态
}
}
RUNNABLE(可运行状态)
线程正在执行任务 可运行状态包括了 READY(就绪状态)和 RUNNING(运行状态)
public class Run {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int i=0;
while(i<10000) {
i++;
}
System.out.println(i);
}
});
t.start();
//获取当前线程的状态 getState()
System.out.println(t.getState()); //RUNNABLE 状态
}
}
BLOCKED(锁阻塞状态)
获取synchronized锁对象失败
public class blocked {
public static void main(String[] args) throws InterruptedException {
Runnable r = new Runnable() {
@Override
public void run() {
synchronized (this) {
for(;;) {}
}
}
};
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
//保证线程启动,并且已经执行到run方法里
Thread.sleep(1000);
//获取当前线程的状态 getState()
//有一个线程为 RUNNABLE状态,一个为 BLOCKED状态
System.out.println("t1:"+t1.getState());
System.out.println("t2:"+t2.getState());
}
}
WAITING(无限等待状态)
获取Lock锁对象失败
一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。
线程A调用wait方法,进入waiting状态,线程B调用notify或者notifyall,并且获得了锁对象,线程A就会回到RUNNABLE(可运行状态)了,如果线程B调用notify或者notifyall,但是并没有获得锁对象,线程A就会进入BLOCKED(锁阻塞状态)了
public class lock {
public static void main(String[] args) throws InterruptedException {
Lock l = new ReentrantLock();
Runnable r = new Runnable() {
@Override
public void run() {
l.lock(); //加锁
while(true) {}
// l.unlock(); //释放锁
}
};
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
//保证线程启动,并且已经执行到run方法里
Thread.sleep(1000);
//获取当前线程的状态 getState()
//有一个线程为 RUNNABLE状态,一个为 WAITING状态
System.out.println("t1:"+t1.getState());
System.out.println("t2:"+t2.getState());
}
}
TIMED_WAITING(计时等待状态)
线程正在执行sleep方法(Thread.sleep())
线程执行了wait(参数)带参数的方法(Object.wait(参数))
一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态。
public class timed_waiting {
public static void main(String[] args) throws InterruptedException {
Object obj = new Object();
Runnable r = new Runnable() {
@Override
public void run() {
try {
//调用了sleep方法
Thread.sleep(1000000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Thread t = new Thread(r);
t.start();
//保证线程启动,并且已经执行到run方法里
Thread.sleep(100);
//获取当前线程的状态 getState()
System.out.println(t.getState()); // TIMED_WAITING 状态
}
}
wait带参或者无参、notify、notifyall,①这些方法必须写在synchronized代码块或方法中;②锁对象和调用这些方法的对象必须是同一个对象
public class timed_waiting {
public static void main(String[] args) throws InterruptedException {
Object obj = new Object();
Runnable r = new Runnable() {
@Override
public void run() {
synchronized (obj) {
try {
//调用了wait(参数)方法
obj.wait(10000000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Thread t = new Thread(r);
t.start();
//保证线程启动,并且已经执行到run方法里
Thread.sleep(100);
//获取当前线程的状态 getState()
System.out.println(t.getState()); // TIMED_WAITING 状态
}
}
TERMINATED(终止状态)
线程执行完任务、销毁后处于该状态
public class Terminated {
public static void main(String[] args) throws InterruptedException {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(1);
}
};
Thread t = new Thread(r);
t.start();
//保证线程启动,并且已经执行到run方法里
Thread.sleep(100);
//获取当前线程的状态 getState()
System.out.println(t.getState());
}
}
调用wait方法无论是否有参数,都会释放锁对象,sleep方法不会释放锁对象