线程的基本方法


线程相关的基本方法有 wait, notify, notifyAll, sleep, join, yield 等。

线程的基本方法围绕着线程的状态来描述比较好理解,因此先来看一张线程状态切换图:

线程等待(wait)

调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后, 会释放对象的锁。因此, wait 方法一般用在同步方法或同步代码块中。

线程睡眠(sleep)

sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED-WATING 状态,而 wait()方法会导致当前线程进入 WATING 状态

线程让步(yield)

yield 会使当前线程让出 CPU 执行时间片,与其他线程一起重新竞争 CPU 时间片。一般情况下,优先级高的线程有更大的可能性成功竞争得到 CPU 时间片, 但这又不是绝对的,有的操作系统对线程优先级并不敏感。

线程中断(interrupt)

中断一个线程,其本意是给这个线程一个通知信号,会影响这个线程内部的一个中断标识位。 这个线程本身并不会因此而改变状态(如阻塞,终止等)。 其中有以下几点需要注意:

Join 等待其他线程终止

join() 方法,等待其他线程终止,在当前线程中调用一个线程的 join() 方法,则当前线程转为阻塞状态,等到另一个线程结束,当前线程再由阻塞状态变为就绪状态,等待 cpu 的宠幸。

为什么要用 join()方法?

很多情况下,主线程生成并启动了子线程,需要用到子线程返回的结果,也就是主线程需要在子线程结束后再结束,这时候就要用到 join() 方法。

System.out.println(Thread.currentThread().getName() + "线程运行开始!");
    Thread thread1 = new Thread6();
    thread1.setName("线程 B");
    thread1.join();
System.out.println("这时 thread1 执行完毕之后才能执行主线程");

线程唤醒(notify)

Object 类中的 notify() 方法, 唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,线程通过调用 wait() 方法,在对象的监视器上等待, 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类似的方法还有 notifyAll() ,唤醒在此监视器上等待的所有线程。

其他方法

  1. sleep():强迫一个线程睡眠N毫秒。

  2. isAlive(): 判断一个线程是否存活。
  3. join(): 等待线程终止。
  4. activeCount(): 程序中活跃的线程数。
  5. enumerate(): 枚举程序中的线程。
  6. currentThread(): 得到当前线程。
  7. isDaemon(): 一个线程是否为守护线程。
  8. setDaemon(): 设置一个线程为守护线程。 (用户线程和守护线程的区别在于,是否等待主线 程依赖于主线程结束而结束)
  9. setName(): 为线程设置一个名称。
  10. wait(): 强迫一个线程等待。

11.notify(): 通知一个线程继续运行。

  1. setPriority(): 设置一个线程的优先级。
  2. getPriority()::获得一个线程的优先级