Join

主线程join一个线程,那么主线程会阻塞直到join进来的线程执行完,主线程继续执行, join如果带超时时间的话,那么如果超时的话主线程也会不再等join进去的线程而继续执行.
join实际就是判断join进来的线程存活状态,如果活着就调用wait(0),如果带超时时间了的话,wait里边的时间会算出来

  1. while (isAlive()) {
  2. wait(0);
  3. }

API

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

    Demo

    ```java public class JoinThread {

    public static void main(String[] args) throws InterruptedException {

    1. JoinT joinT = new JoinT();
    2. for (int i = 0; i < 50; i++) {
    3. if (i == 10) {
    4. joinT.start();
    5. joinT.join();
    6. }
    7. //执行完join的线程后继续执行主线程
    8. System.out.println(Thread.currentThread().getName() + "--" + i);
    9. }

    } }

class JoinT extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+”—“+i); } } }

  1. <a name="ZVQ4t"></a>
  2. # Sleep
  3. 睡觉方法,也可以理解为暂停一段时间,**注意**与wait()不同的是sleep并不会让线程释放锁
  4. <a name="DI8m9"></a>
  5. ### API
  6. - public static native void sleep(long millis) throws InterruptedException
  7. - public static void sleep(long millis, int nanos) throws InterruptedException
  8. <a name="yCbRJ"></a>
  9. # Yield
  10. 也是让线程暂停一下,但是是进入就绪状态,让掉当前线程CPU的时间片,让系统重新开始一次新的调度过程
  11. ```java
  12. Thread.yield()

yield 和 sleep 的异同
1)yield, sleep 都能暂停当前线程,sleep 可以指定具体休眠的时间,而 yield 则依赖 CPU 的时间片划分。

2)yield, sleep 两个在暂停过程中,如已经持有锁,则都不会释放锁资源。

3)yield 不能被中断,而 sleep 则可以接受中断。

中断

Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。
前面有一些方法声明了InterruptedException, 这意味者他们可以被中断,中断后把异常抛给调用方,让调用方自己处理.
被中断的线程可以自已处理中断,也可以不处理或者抛出去。