Java基础程序员Java学习笔记

线程基础--join&yeild&sleep

2017-01-27  本文已影响38人  小鱼嘻嘻
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

上一篇 下一篇

猜你喜欢

热点阅读