public static void sleep(long millis, int nanos) throws InterruptedException public static native void sleep(long millis) throws InterruptedException;
sleep方法的做用是让当前线程暂停执行指定时间,给执行机会留给其余线程,可是调用sleep不会释放对象锁java
可使用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方法返回的是一个线程实例,这个实例就是指当前代码正在被哪一个线程调用的线程实例,能够经过这个方法来获取线程的相关的一些信息,好比线程ID,线程名称等。生命周期
public static native Thread currentThread();
getId方法返回的是线程的ID,这个线程ID是在线程初始化时生成的一个惟一长整型数值队列
public long getId()
在建立线程的初始化方法里设置线程ID,生成线程ID的方法是一个静态同步方法,保证了生成ID的惟一性事件
private void init(...){ ...省略... // 设置线程ID tid = nextThreadID(); } // 生成线程ID private static synchronized long nextThreadID() { return ++threadSeqNumber; }
getName方法返回的是线程名称,在建立线程初始化的时候生成get
public final String getName() public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } private static synchronized int nextThreadNum() { return threadInitNumber++; }
isAlive是用来判断一个线程是否存活,而判断一个线程是否存活在于线程已经启动可是尚未死亡(也就是线程执行完毕)同步
public final native boolean isAlive();
interrupt方法用来中断线程能够中断Object#wait、Thread#join、Thread#sleep等各自的一系列方法,而且会抛出一个InterruptedException异常
当调用上述方法时,会使得线程进入一个阻塞的状态,在另外一个线程里调用某线程的interrupt方法就能够打断某个线程的阻塞状态。可是打断并是意味着线程的生命周期已经结束,仅仅是打断了了这种阻塞的状态。被中断的线程会抛出InterruptedException异常,这个异常至关因而一个信号同样,通知当前线程被打断了。it
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方法底层是调用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方法就是暗示线程调度执行器,当前线程愿意让出当前处理器的使用,给执行机会留给其余线程,可是线程调度执行器也能够忽略这个暗示,说白了就是这个让出了处理器的线程,能够再次被线程调度执行器选中占有处理器从而继续执行。
public static native void yield();