线程状态
Java中线程的状态有六种,分别为:
① 新建(NEW):新创建出来的线程且还没有调用start()时处于新建状态
② 就绪(RUNNABLE):调用了start()方法后,线程处于就绪状态。注意,调用start方法后并不能使线程立即执行。
③ 阻塞(BLOCKED):当一个锁被其他线程占用时,此时当前线程进入阻塞状态,等待获取锁。
④ 等待(WAITING) :当一个线程调用了join()、wait()方法时,线程进入等待状态。
⑤ 超时等待(TIMED_WAITING):当一个线程调用sleep(),或者wait(long mill)、join(long mill)时,线程进入超时等待状态。
⑥ 终止状态(TERMINATED):线程终止时线程所处的状态。
线程六状态转换关系图:

常用方法
① currentThread():是一个静态方法,并且是一个native方法,返回当前正在执行的线程。
② wait():是Object类中的方法,目的是将调用的obj.wait()的线程置为waiting状态,等待其他线程调用obj.notify()或notifyAll()来唤醒。最常见的就是生产者消费者模型。wait()方法会释放掉当前线程的锁对象。
③ sleep():sleep()方法是Thread类中的方法。一个线程调用了sleep(),则该线程进入阻塞状态。==一个线程调用了sleep(),不会释放锁对象。==该方法会抛出InterruptedException异常。
Thread.sleep()和Thread.currentThread.sleep()有什么区别?
如果该线程是通过继承Thread类来实现的话,这两种方式并没有什么区别,都是设置线程的睡眠时间。如果是通过Runnable接口来实现的话,就不能直接使用Thread.sleep(),而必须使用Thread.currentThread.sleep()来设置睡眠时间。
Thread.sleep()和Object.wait()有什么区别?
① wait()是Object类中的方法,而sleep()是Thread类中的方法。
② 虽然sleep()同样使当前线程进入阻塞状态,但是当前线程不会释放掉监视器锁。而wait()不仅使线程进入阻塞状态,还是使当前线程释放掉监视器锁。
③ wait()有无参的wait(),调用的是wait(0),表示无限期等待,而sleep()没有无参办法。
④ sleep()可以在任何地方使用,而wait()只能在同步方法或同步代码块中使用。
在jdk1.5之后,引入了一个枚举类:TimeUnit,对sleep()方法做了封装。
例如:线程睡眠3小时27分8秒88毫秒,我们就可以使用TimeUnit:
TimeUnit.HOURS.sleep(3);
TimeUnit.MINUTES.sleep(27);
TimeUnit.SECONDS.sleep(8);
TimeUnit.MILLISECONDS.sleep(88);
减少了换算的时间。
④ yield():一个本地方法,调用yield对于cpu来说只是一个建议,告诉cpu当前线程愿意让出cpu时间片给其他线程使用,值域cpu采取不采取,取决于不同的cpu行为。如果cpu采取建议,则该线程会从运行状态变为就绪状态。
⑤ isAlive():判断一个线程是否存活。
⑥ join():如果在线程A中调用线程B的join(),则线程A会进入到阻塞状态,直到线程B执行完后,线程A才会执行剩余的过程。join(long mills):限时等待,等待指定的时间,如果指定的时间到了,则会被自动唤醒。
⑦ Interrupt():线程中断,该方法可以中断当前线程,线程进入到“阻塞状态”或者线程运行结束。
守护线程
守护线程:deamon。
作用:服务于非守护线程。垃圾回收线程就是一个典型的守护线程。
守护线程的生命周期是依赖于非守护线程的。
线程优先级
Priority:代表线程优先级。
java中线程分为10个优先级,默认的优先级是5。线程的优先级最终效果,并不依赖这10个优先级,这10个优先级只是对cpu的一个建议。
Java线程状态与常用方法解析
本文介绍了Java中线程的六种状态,包括新建、就绪、阻塞、等待、超时等待和终止,并详细阐述了线程状态转换。此外,还讲解了线程的常用方法如currentThread(), wait(), sleep(), yield(), isAlive(), join()和Interrupt(),以及守护线程的概念和线程优先级。"
95079658,7696625,Python基础知识详解,"['Python基础', '编程语法', '数据类型', '控制结构', '文件操作']
4978

被折叠的 条评论
为什么被折叠?



