线程的六种状态:
Java语言定义了6种线程状态, 在任意一个时间点中, 一个线程只能有且只有其中的一种状态, 并且可以通过特定的方法在不同状态之间转换。 这6种状态分别是:
·新建(New) : 创建后尚未启动的线程处于这种状态。
·运行(Runnable): 包括操作系统线程状态中的Running和Ready, 也就是处于此状态的线程有可能正在执行, 也有可能正在等待着操作系统为它分配执行时间。
·无限期等待(Waiting) : 处于这种状态的线程不会被分配处理器执行时间, 它们要等待被其他线程显式唤醒。 以下方法会让线程陷入无限期的等待状态:
■没有设置Timeout参数的Object::wait()方法;
■没有设置Timeout参数的Thread::join()方法;
■LockSupport::park()方法。
·限期等待(Timed Waiting) : 处于这种状态的线程也不会被分配处理器执行时间, 不过无须等待被其他线程显式唤醒, 在一定时间之后它们会由系统自动唤醒。 以下方法会让线程进入限期等待状态:
■Thread::sleep()方法;
■设置了Timeout参数的Object::wait()方法;
■设置了Timeout参数的Thread::join()方法;
■LockSupport::parkNanos()方法;
■LockSupport::parkUntil()方法。
·阻塞(Blocked) : 线程被阻塞了, “阻塞状态”与“等待状态”的区别是“阻塞状态”在等待着获取到一个排它锁, 这个事件将在另外一个线程放弃这个锁的时候发生; 而“等待状态”则是在等待一段时间, 或者唤醒动作的发生。 在程序等待进入同步区域的时候, 线程将进入这种状态。
·结束(Terminated) : 已终止线程的线程状态, 线程已经结束执行。
线程的方法
- yield()和sleep()方法的区别:
- yield()方法会使当前线程进入就绪状态,只会给优先级相同或者更高的线程提供运行的机会
- sleep()方法会是当前线程进入阻塞状态,不会考虑线程的优先级,优先级较低的线程也会获得运行的机会
- join():
- 该方法的含义是用于等待当前线程终止。例如:线程A里执行代码:threadB.join();就会执行线程B,直到线程B执行完才继续执行线程A剩下的代码