线程基础--join&yeild&sleep

  • 1 sleep休眠的意思,特点是在休眠的时候如果有锁是不会释放锁的。
  • 2 join例如t.join()意思是,阻塞当前调用线程,直到线程t执行完成。
  • 3 yeild意思是让出CPU让其他线程执行。
    来分别看一下例子:
    sleep:
package com.yuxi;

/**
 * 线程休眠的例子
 * Created by yuxi on 17/1/27.
 */
public class SleepDemo {
    public static void main(String[] args) {
        MyThread m = new MyThread();
        //加锁之后看如果一个线程进入休眠,是否其他的线程可以拿到这个锁
        new Thread(m).start();
        new Thread(m).start();
        new Thread(m).start();
    }

    static class MyThread implements Runnable {
        public void run() {
            synchronized (this) {
                try {
                    System.out.println(Thread.currentThread().getName()+"当前线程休眠。。。" + System.currentTimeMillis());
                    Thread.sleep(5000);
                    System.out.println(Thread.currentThread().getName()+"当前线程休眠。。。" + System.currentTimeMillis());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

结果是:

Thread-0当前线程休眠。。。1485488800173
Thread-0当前线程休眠。。。1485488805177
Thread-2当前线程休眠。。。1485488805177
Thread-2当前线程休眠。。。1485488810181
Thread-1当前线程休眠。。。1485488810181
Thread-1当前线程休眠。。。1485488815185

yeild:

package com.yuxi;

/**
 * yeild 高风亮节让出cup
 * Created by yuxi on 17/1/27.
 */
public class YeildDemo {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        new Thread(myThread).start();
        new Thread(myThread).start();

    }

    static class MyThread implements Runnable {
        public synchronized void run() {
            for (int i = 0; i < 100; i++) {
                if (i % 4 == 0) {
                    Thread.yield();
                } else {
                    System.out.println("当前线程为。。。。" + Thread.currentThread().getName());
                }


            }
        }

    }
}

结果是:

当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-0
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1
当前线程为。。。。Thread-1

其实执行结果可以看出让出CPU并不是说就一定会让另外一个线程执行,还是抢占式的。
join:
一道经常出现的面试题,怎么保证T1,T2,T3三个同时启动的线程按照顺序执行,例如顺序T1,T2,T3

package com.yuxi;

/**
 * 一道经常出现的面试题,怎么保证T1,T2,T3三个同时启动的线程按照顺序执行,例如顺序T1,T2,T3
 * Created by yuxi on 17/1/27.
 */
public class JoinDemo {
    public static void main(String[] args) {
        final Thread T1 = new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(10);
                    System.out.println("this is  t1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        final Thread T2 = new Thread(new Runnable() {
            public void run() {
                try {
                    T1.join();
                    Thread.sleep(10);
                    System.out.println("this is  t2");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        final Thread T3 = new Thread(new Runnable() {
            public void run() {
                try {
                    T2.join();
                    Thread.sleep(10);
                    System.out.println("this is  t3");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        T2.start();
        T3.start();
        T1.start();
    }

}

结果是:

this is  t1
this is  t2
this is  t3

参考文章:
http://www.cnblogs.com/skywang12345/p/3479243.html

你可能感兴趣的:(线程基础--join&yeild&sleep)