一、状态二、方法
2.1 start()2.2 run()2.3 yield()2.4 join() 三、状态与方法关系图
一、状态线程共有6个状态。
| 状态 | 名称 |
|---|---|
| new(新建状态) | 用new创建的线程处于新建状态,此时他和其他的Java对象一样,仅仅在堆中分配了内存,没有调用start方法。 |
| runable(就绪状态) | 调用start方法,线程处于就绪状态 |
| blocked(阻塞状态) | 因为某些原因放弃CPU(缺少资源:IO、锁),暂时停止运行,进入阻塞状态 |
| waiting(等待状态) | 线程中的对象的调用wait()时,JVM就会将线程放入到等待池中 |
| timed_waiting(睡眠状态) | 在指定的等待时间内等待线程的状态 |
| terminated(终止状态) | 线程已经执行完毕 |
源码如下:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
二、方法 2.1 start()正常的线程只有四个状态:新建状态(NEW)、RUNNABLE(就绪状态)、终止状态(TERMINATED)。非正常状态:阻塞状态(BLOCKED)、等待状态(WAITING)、睡眠状态(TIME WAITING)
启动操作系统的线程,进入就绪队列,等待CPU分配时间片,获取到时间片后执行线程的run方法。(start()只能执行一次)
源码如下:
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
2.2 run()
业务逻辑的实现方法。
直接调用run方法不会启动线程调用start方法以后,JVM会自动的运行run方法
源码如下:
@Override
public void run() {
if (target != null) {
target.run();
}
}
2.3 yield()
将运行中的线程便会就绪状态,让出cpu的执行权,并通知操作系统从就绪线程中选出线程运行(可选择原来执行yield的线程)
注意:不释放资源
源码如下:
public static native void yield();
2.4 join()
当有新的线程加入时,主线程会进入等待(waiting)状态,一直到调用join()方法的线程执行结束为止。
当不调用join方法时,等到主线程执行完,才执行其他线程。
Runnable runnable = new RunnableDemo(){
@Override
public void run() {
System.out.println("执行中....");
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
System.out.println("执行完毕");
执行结果:
执行完毕 执行中.... 执行中....
调用join方法时,先执行指定线程
Runnable runnable = new RunnableDemo(){
@Override
public void run() {
System.out.println("执行中....");
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
try{
t1.join();
t2.join();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("执行完毕");
执行结果:
执行中.... 执行中.... 执行完毕三、状态与方法关系图



