线程的基本属性和方法

本文详细介绍了Java线程的基本属性,如id、name、优先级、状态以及daemon线程的作用。此外,还涵盖了sleep、yield、join等关键方法的使用和过时方法的说明。
摘要由CSDN通过智能技术生成

线程有一些基本属性和方法,包括id、name、优先级、状态、是否daemo线程、sleep方法、yield方法、join方法、过时方法等,我们简要介绍。

1. id和name

前面我们提到,每个线程都有一个id和name。id是一个递增的整数,每创建一个线程就加一。name的默认值是Thread-后跟一个编号,name可以在Thread的构造方法中进行指定,也可以通过setName方法进行设置,给Thread设置一个友好的名字,可以方便调试。

2. 优先级(Priority)

线程有一个优先级的概念,在Java中,优先级从1到10,默认为5,相关方法是:

public final void setPriority(int newPriority)
public final int getPriority()

这个优先级会被映射到操作系统中线程的优先级,不过,因为操作系统各不相同,不一定都是10个优先级,Java中不同的优先级可能会被映射到操作系统中相同的优先级。另外,优先级对操作系统而言主要是一种建议和提示,而非强制。简单地说,在编程中,不要过于依赖优先级。

3. 状态(State)

线程有一个状态的概念,Thread有一个方法用于获取线程的状态:、

public State getState()

返回值类型为Thread.State,它是一个枚举类型,有如下值:

public enum State {
  NEW,
  RUNNABLE,
  BLOCKED,
  WAITING,
  TIMED_WAITING,
  TERMINATED;
}

关于这些状态,我们简单解释下:

1)NEW:没有调用start的线程状态为NEW。

2)TERMINATED:线程运行结束后状态为TERMINATED。

3)RUNNABLE:调用start后线程在执行run方法且没有阻塞时状态为RUNNABLE,不过,RUNNABLE不代表CPU一定在执行该线程的代码,可能正在执行也可能在等待操作系统分配时间片,只是它没有在等待其他条件。4)BLOCKED:线程的BLOCKED状态表示线程正在等待获取一个对象的同步锁,以进入一个同步块。当一个线程尝试进入一个同步块,但该同步块已经被其他线程持有锁时,这个线程将被置于BLOCKED状态。

5)WAITING:指线程正在等待其他线程采取某些操作,具体来说,当线程处于以下情况时,它将处于WAITING状态:

  1. 线程调用了Object类的wait()方法,使得线程等待在某个对象上;
  2. 线程调用了Thread类的join()方法,等待其他线程执行完毕;
  3. 线程调用了LockSupport.park()方法,使得线程进入等待状态。

在这些情况下,线程都会处于WAITING状态,直到其他线程对其进行唤醒或者特定条件满足时才能继续执行。这个状态与TIMED_WAITING状态相比,不具有时间限制,即线程会一直等待下去直到被唤醒。

6)TIMED_WAITING:线程正在等待满足某个条件,但具有一个超时时间限制。

  1. sleep()方法:通过调用Thread类的sleep(long millis)方法使线程休眠一段指定的时间。
  2. wait()方法:通过调用Object类的wait(long timeout)方法将线程置于等待状态,直到被其他线程唤醒或等待时间超过指定的超时时间。
  3. join()方法:通过调用Thread类的join(long millis)方法使线程等待另一个线程执行完毕,最多等待指定的超时时间。

在这些情况下,线程会进入TIMED_WAITING状态,并在等待一段时间后自动恢复运行或被唤醒。

4. isAlive

Thread还有一个方法,返回线程是否活着:

public final native boolean isAlive()

前面我们提到,启动线程会启动一条单独的执行流,整个程序只有在所有线程都结束的时候才退出,但daemon线程是例外,当整个程序中剩下的都是daemon线程的时候,程序就会退出。daemon线程有什么用呢?它一般是其他线程的辅助线程,在它辅助的主线程退出的时候,它就没有存在的意义了。在我们运行一个即使最简单的"hello world"类型的程序时,实际上,Java也会创建多个线程,除了main线程外,至少还有一个负责垃圾回收的线程,这个线程就是daemon线程,在main线程结束的时候,垃圾回收线程也会退出。

5. sleep方法

Thread有一个静态的sleep方法,调用该方法会让当前线程睡眠指定的时间,单位是毫秒:

public static native void sleep(long millis) throws InterruptedException;

睡眠期间,该线程会让出CPU,但睡眠的时间不一定是确切的给定毫秒数,可能有一定的偏差,偏差与系统定时器和操作系统调度器的准确度和精度有关。睡眠期间,线程可以被中断,如果被中断,sleep会抛出InterruptedException。

6. yield方法

Thread还有一个让出CPU的方法:

public static native void yield();

这也是一个静态方法,调用该方法,是告诉操作系统的调度器:我现在不着急占用CPU,你可以先让其他线程运行。不过,这对调度器也仅仅是建议,调度器如何处理是不一定的,它可能完全忽略该调用。

7. join方法

在前面HelloThread的例子中,HelloThread没执行完,main线程可能就执行完了, Thread有一个join方法,可以让调用join的线程等待该线程结束,join方法的声明为:

public final void join() throws InterruptedException

join方法还有一个变体,可以限定等待的最长时间,单位为毫秒,如果为0,表示无期限等待:

public final synchronized void join(long millis) throws InterruptedException

8. 过时方法

Thread类中还有一些看上去可以控制线程生命周期的方法,如:

public final void stop()
public final void suspend()
public final void resume()

这些方法因为各种原因已被标记为了过时,我们不应该在程序中使用它们。

关注公众号:小黄学编程   回复:架构师  获取小黄收集的架构师资料

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值