线程基础--join&yeild&sleep

作者: 小鱼嘻嘻 | 来源:发表于2017-01-27 12:32 被阅读38次
    • 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

        本文链接:https://www.haomeiwen.com/subject/pfmfittx.html