多线程基础(二)---Thread类中常用的方法

Thread类中常用的方法

1public static native Thread currentThread()

该方法可以返回代码段正在被哪个线程调用的信息。

2public static native void yield()

暂停线程,让CPU执行其它线程。在正常情况下,线程获得CPU时间片开始执行,当时间片用完后,线程进入可运行状态,CPU切换线程,线程调度器随机地从处于可运行状态的线程中选取一条(就算设置了优先级,也只是机会更大而已),线程获得时间片,开始执行,由于切换的速度很快,以达到看起来像同时运行的效果。而调用yield方法就等于是人为地通知系统进行切换,线程回到可运行状态,但是也可能是刚刚放弃CPU使用权又马上被选中,获得时间片继续执行。
注意:这里是暂停线程,并不会释放锁。

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

public static void sleep(long millis, int nanos)
throws InterruptedException {

强制当前正在执行的线程休眠,让其它线程去抢占CPU使用权。正在休眠的线程将处于阻塞状态,休眠结束后将回到可运行状态,等待被选中,所以方法中设置的时间是线程从不执行到执行的最短时间,而不是一休眠完就马上继续执行。sleep方法不会释放锁。

4public void interrupt() {

interrupt是中断的意思,interrupt方法用来中断线程,即停止当前正在进行的操作,但是并不是调用了interrupt方法线程就中断了,该方法只是给线程打上中断标记。线程在睡眠时调用此方法会抛出InterrupterException,并清除中断状态,变成false。

5public static boolean interrupted()

判断当前线程是否中断,当前线程是指运行interrupted()的线程。该方法是个静态方法,我们一般通过类名进行调用,但是也可以通过实例进行调用,当使用线程实例去调用时,容易以为是判断该线程实例的中断标志,其实依然是判断运行interrupted()的线程是否中断。

该方法会重置中断状态,也就是第一次调用该方法返回true值后再进行调用会返回false,除非再次调用interrupt方法再次中断线程。

6public boolean isInterrupted()

判断线程是否中断,该方法区别于interrupted方法,是个实例方法,只能通过线程实例去调用,用于判断该线程是否中断。

该方法不会重置中断状态。

7public final native boolean isAlive()

判断当前线程是否处于活动状态,是实例方法,用于判断调用者是否处于活动状态。线程处于执行状态、可运行状态或者是阻塞状态都算活动状态。

8public final void setPriority(int newPriority)

设置线程的优先级。

9public final int getPriority()

获取线程的优先级。

10public final void setName(String name)

设置线程名字。

11public final String getName()

获取线程名字。

12public long getId()

获取线程ID。

13public final void setDaemon(boolean on)

把当前线程设置成守护线程。

14public final boolean isDaemon() 

判断线程是否是守护线程。

15public final synchronized void join(long millis)
    throws InterruptedException

public final synchronized void join(long millis, int nanos)

public final void join() throws InterruptedException

等待线程结束。join方法我理解为把子线程加入到调用该方法的线程。调用该方法的线程会阻塞直到子线程执行结束才继续执行,也就是从并行变成串行。

继承于Object类的方法:

16public final native void notify();

从等待池中唤醒一个线程,把它转移到锁池。

16public final native void notifyAll();

从等待池中唤醒所有的线程,把它们转移到锁池。

17public final void wait() throws InterruptedException

public final native void wait(long timeout) 
throws InterruptedException

public final void wait(long timeout, int nanos) 
throws InterruptedException

使当前的线程进入等待,直到其他线程调用此对象的notify() 方法或 notifyAll()
方法,或者超过指定的时间量唤醒它。

线程的状态图:
图1

  • 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。
  • 等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池中。如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池。

猜你喜欢

转载自blog.csdn.net/maijia0754/article/details/79682865