美文网首页
多线程系列第(四)篇---线程的优先级以及yeild和join方

多线程系列第(四)篇---线程的优先级以及yeild和join方

作者: sofarsogoo_932d | 来源:发表于2017-10-10 23:18 被阅读0次

线程的优先级

1.线程的优先级分为1到10,1对应MIN_PRIORITY,10对应MAX_PRIORITY
2.可以通过setPriority方法为线程设置优先级,默认的优先级为5
3.在线程启动前设置线程的优先级
4.优先级高的线程不一定就先执行完,只是在进入运行状态的机会要高于优先级低的线程而已
结论:我们不能指望通过设置线程的优先级来影响线程的执行顺序,而要通过其他方法来制定线程的执行顺序

优先级代码示例

public class PriorityDemo {

class Thread1 extends Thread {

    public Thread1(String name) {
        super(name);
    }

    public void run() {
        int random;
        for (int i = 0; i < 5; i++) {
            random=new Random().nextInt(100);
            System.out.println(getName()+"第"+i+"次获得随机数"+random);
        }
    }
}

class Thread2 extends Thread {

    public Thread2(String name) {
        super(name);
    }

    public void run() {
        int random;
        for (int i = 0; i < 5; i++) {
            random=new Random().nextInt(100);
            System.out.println(getName()+"第"+i+"次获得随机数"+random);
        }
    }
}

public static void main(String[] args) {
    PriorityDemo demo=new PriorityDemo();
    Thread1 t1=demo.new Thread1("线程1");
    Thread1 t2=demo.new Thread1("线程2");
    
    t1.setPriority(Thread.MIN_PRIORITY);
    t2.setPriority(Thread.MAX_PRIORITY);
    
    t1.start();
    t2.start();
    }
}

运行结果
线程1第0次获得随机数18
线程2第0次获得随机数43
线程1第1次获得随机数6
线程2第1次获得随机数6
线程1第2次获得随机数15
线程2第2次获得随机数32
线程1第3次获得随机数16
线程1第4次获得随机数73
线程2第3次获得随机数81
线程2第4次获得随机数11

当然上面只是其中的一种运行结果,列出这个结果主要是想说明,优先级高的不一定就先执行完

yeild

一个调用yield方法的线程,是要告诉虚拟机它乐意让其他线程占用自己的位置,yield将当前线程由运行状态置为就绪状态,来达到让步的目的,但是刚进入就绪状态的线程也可能马上进入运行状态。

yield代码示例

public class YeildDemo {

class Thread1 extends Thread {

    public Thread1(String name) {
        super(name);
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(getName() + "第" + i + "次执行");
            Thread.yield();
        }
    }
}

class Thread2 extends Thread {

    public Thread2(String name) {
        super(name);
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(getName() + "第" + i + "次执行");
            Thread.yield();
        }
    }
}

public static void main(String[] args) {
    YeildDemo demo = new YeildDemo();
    Thread1 t1 = demo.new Thread1("线程1");
    Thread1 t2 = demo.new Thread1("线程2");

    t1.start();
    t2.start();
  }
}

上述代码在没有调用yeild方法的输出结果

线程1第0次执行
线程1第1次执行
线程1第2次执行
线程1第3次执行
线程1第4次执行
线程2第0次执行
线程2第1次执行
线程2第2次执行
线程2第3次执行
线程2第4次执行

上述代码在调用yeild方法的输出结果

线程2第0次执行
线程1第0次执行
线程2第1次执行
线程1第1次执行
线程2第2次执行
线程1第2次执行
线程2第3次执行
线程1第3次执行
线程2第4次执行
线程1第4次执行

当然上述结果只是其中的一种运行结果,但经过多次运行,大致就是上面的规律。

join

阻塞当前线程,直到调用join方法的线程执行结束之后,才恢复执行

join代码示例

public class JoinDemo {

class Thread1 extends Thread {

    public Thread1(String name) {
        super(name);
    }

    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(getName() + "第" + i + "次执行");
        }
    }
}

class Thread2 extends Thread {

    public Thread2(String name) {
        super(name);
    }

    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(getName() + "第" + i + "次执行");
        }
    }
}

public static void main(String[] args) {
    System.out.println(Thread.currentThread().getName()+"执行开始");

    
    JoinDemo demo = new JoinDemo();
    Thread1 t1 = demo.new Thread1("线程1");
    Thread1 t2 = demo.new Thread1("线程2");


    t1.start();
    t2.start();
    
    try {
        t1.join();
        t2.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println(Thread.currentThread().getName()+"执行结束");
  }

}

上述程序在没有调用t1和t2的join方法的运行结果如下

main执行开始
main执行结束
线程1第0次执行
线程1第1次执行
线程1第2次执行
线程2第0次执行
线程2第1次执行
线程2第2次执行

上述程序在在调用了t1和t2的join方法的运行结果如下

main执行开始
线程1第0次执行
线程1第1次执行
线程1第2次执行
线程2第0次执行
线程2第1次执行
线程2第2次执行
main执行结束

相关文章

  • 多线程系列第(四)篇---线程的优先级以及yeild和join方

    线程的优先级 1.线程的优先级分为1到10,1对应MIN_PRIORITY,10对应MAX_PRIORITY2.可...

  • android 面试题总结

    Jave部分 一、多线程 Join() 线程加入,执行此方法的线程优先使用cpu Yeild() 线程释放...

  • day18-多线程

    recode 一、多线程技术1 二、多线程技术2 三、client 多线程应用 四、join函数 耗时操作

  • 多线程

    简单讲解了关于多线程的一些应用:线程进程的概念区别,定义多线程,多线程之间的通信,线程的死锁,以及线程的优先级。此...

  • Java多线程知识点归纳总结

    1.线程的五种状态以及互相切换 2.notify/wait 3.yeild 4.sleep 5.join 6.实现...

  • 多线程

    多线程技术 多线程技术2 多线程应用 server client join函数

  • 多线程

    进程/线程/串行/多线程的概念、原理以及多线程的优劣/多线程在iOS的应用和使用方式请参考CC老师系列文章:01 ...

  • 多线程(四)、Android多线程使用及AsyncTask源码分

    本篇是多线程系列的第四篇,如果对前三篇感兴趣的也可以去看看。多线程(一)、基础概念及notify()和wait()...

  • Android:多线程总结

    多线程总结 问题一:多线程join如何实现? join用来等待一个线程完成。join方法会调用wait函数,这个w...

  • (三)线程的并发工具类

    Fork-Join java 下多线程的开发可以我们自己启用多线程,线程池,还可以使用fork-join ,for...

网友评论

      本文标题:多线程系列第(四)篇---线程的优先级以及yeild和join方

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