三、Thread API的简单介绍

一、sleep方法

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

sleep方法的做用是让当前线程暂停执行指定时间,给执行机会留给其余线程,可是调用sleep不会释放对象锁java

1.一、用TimeUnit代替Thread.sleep

  可使用TimeUnit类代替Thread.sleep,TimeUnit是jdk1.5之后增长的一个枚举类,对sleep方法提供了很好的封装,能够省去时间单位的换算。线程

思考1:sleep(n)和sleep(0)有什么不一样
  线程有Runnable和Waiting两种状态,Runnable状态又包含就绪状态和运行状态,当调用sleep(n)时,当前线程从运行状态转为等待状态,线程被放入等待队列,等待定时器n秒后的中断事件,当到达n秒计时时,线程从等待队列进入到就绪队列。须要注意的是等待队列里的线程是不参与CPU竞争的,而就绪队列里的线程才会参与CPU竞争;
  当调用sleep(0)时,当前线程是直接从运行状态转为就绪状态的,即线程直接进入到了就绪队列,就会参与CPU竞争。固然调用sleep(0)的目的并不是真正的让线程挂起0毫秒,而是在于让当前线程暂时放弃CPU,给执行机会留给其它线程,至关于一个让位动做。code

思考2:如何唤醒正在睡眠的线程(sleeping)
  调用Sleep(n)会使得当前线程暂停执行指定时间,线程进入等待队列,而且不会释放对象锁,这时线程状态就变为阻塞状态,若是另一个线程调用被阻塞线程的interrupt方法,那么就能够打断这种阻塞,而且会抛出InterruptedException,可是若是线程已是死亡的状态了,那么尝试对其interrupt就会被忽略。
相似Object的wait、Thread的sleep、Thread的join等方法都会使得线程进入阻塞状态,调用Thread的interrupt都会打断这种阻塞。对象

二、currentThread方法

  currentThread方法返回的是一个线程实例,这个实例就是指当前代码正在被哪一个线程调用的线程实例,能够经过这个方法来获取线程的相关的一些信息,好比线程ID,线程名称等。生命周期

public static native Thread currentThread();

三、getId方法

  getId方法返回的是线程的ID,这个线程ID是在线程初始化时生成的一个惟一长整型数值队列

public long getId()

  在建立线程的初始化方法里设置线程ID,生成线程ID的方法是一个静态同步方法,保证了生成ID的惟一性事件

private void init(...){
    ...省略...
    // 设置线程ID
    tid = nextThreadID();
}    
// 生成线程ID
private static synchronized long nextThreadID() {
    return ++threadSeqNumber;
}

四、getName方法

  getName方法返回的是线程名称,在建立线程初始化的时候生成get

public final String getName()

public Thread(Runnable target) {
    init(null, target, "Thread-" + nextThreadNum(), 0);
}

private static synchronized int nextThreadNum() {
    return threadInitNumber++;
}

五、isAlive方法

  isAlive是用来判断一个线程是否存活,而判断一个线程是否存活在于线程已经启动可是尚未死亡(也就是线程执行完毕)同步

public final native boolean isAlive();

六、interrupt方法

  interrupt方法用来中断线程能够中断Object#wait、Thread#join、Thread#sleep等各自的一系列方法,而且会抛出一个InterruptedException异常
当调用上述方法时,会使得线程进入一个阻塞的状态,在另外一个线程里调用某线程的interrupt方法就能够打断某个线程的阻塞状态。可是打断并是意味着线程的生命周期已经结束,仅仅是打断了了这种阻塞的状态。被中断的线程会抛出InterruptedException异常,这个异常至关因而一个信号同样,通知当前线程被打断了。it

七、interrupted方法与isInterrupted方法

  interrupted():用来判断当前线程是否已经中断,执行后具备将状态标志置为false的功能

public static boolean interrupted() {
    return currentThread().isInterrupted(true);
}

  isInterrupted():用来判断某个线程是否已经中断,不具备清除状态标志的功能

public boolean isInterrupted() {
    return isInterrupted(false);
}

private native boolean isInterrupted(boolean ClearInterrupted);

八、join方法

  join方法就是主线程中调用子线程的join方法,主线程会等待子线程执行完毕后,才会继续执行。
  join方法底层是调用Object类的wait方法,所以也必须加对象锁

public final synchronized void join(long millis) throws InterruptedException
public final synchronized void join(long millis, int nanos) throws InterruptedException
public final void join() throws InterruptedException {
    join(0);
}

九、yield方法

  调用yield方法就是暗示线程调度执行器,当前线程愿意让出当前处理器的使用,给执行机会留给其余线程,可是线程调度执行器也能够忽略这个暗示,说白了就是这个让出了处理器的线程,能够再次被线程调度执行器选中占有处理器从而继续执行。

public static native void yield();
相关文章
相关标签/搜索