线程基础--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

    1 sleep休眠的意思,特点是在休眠的时候如果有锁是不会释放锁的。 2 join例如t.join()意思是,阻塞...

  • 多线程笔记

    一:基础部分 并发与并行: 进程与线程: 线程调度: Thread.sleep(); //静态方法 可直接使用 ...

  • Thread-sleep()

    一、sleep() 1、作用让调用sleep()的线程睡眠(须告知线程要睡多久),线程sleep()就是让出cpu...

  • Thread各方法适用情况

    sleep() sleep()方法会使线程睡眠,交出CPU给其他线程使用。 注意:sleep()方法不会释放锁。 ...

  • JAVA多线程07-基础篇-线程休眠sleep()

    本节摘要:sleep()功能介绍,sleep()用法示例 一、功能介绍 让当前线程(调用sleep()方法的线程)...

  • JAVA -- 线程的sleep()方法为什么是静态的

    sleep()只能让当前线程睡眠,当前线程是自愿的。如果让sleep()成为实例方法,当前线程可以直接sleep别...

  • 【JAVA基础-多线程】- 多线程(补充)

    线程控制的常见方法 sleep 休眠线程public static native void sleep(long ...

  • 线程主要方法

    线程方法,结合线程状态图一起看 sleep() 与 interrupt()sleep(long millis): ...

  • JAVA线程sleep和wait方法区别

    JAVA线程sleep和wait方法区别 一 sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时...

  • Thread

    2019-10-17 sleep sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但...

网友评论

    本文标题:线程基础--join&yeild&sleep

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