前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >笔记 34 | java线程之Thread线程优先

笔记 34 | java线程之Thread线程优先

作者头像
项勇
发布2018-06-19 15:23:21
4200
发布2018-06-19 15:23:21
举报
文章被收录于专栏:项勇项勇

地址

http://www.jianshu.com/p/c2eddba38bc2 http://blog.csdn.net/xiangyong_1521/article/details/78529102

前言

当我们需要在几个线程中排个优先执行的顺序时,我们就需要用到线程优先的相关方法, Thread类有setPriority(int level)方法用来设置线程的优先级。 线程的有限级从1到10,1是最不重要的,10是最重要的。如果没有给线程设置优先级,那么线程的优先级将是默认值5.

目录

  • 未设置线程优先
  • 设置了线程优先

1.未设置线程优先
代码语言:javascript
复制
@Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        Text1();
        text2();
    }

    private void Text1() {
        Thread thread1 = new Thread(new TestThead(1));
        Thread thread2 = new Thread(new TestThead(2));

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (Exception e) {

        }
    }

    private void text2() {

    }  

    class TestThead implements Runnable{
        int id ;

        public TestThead(int id ){
            this.id=id;
        }
        @Override
        public void run() {
            try {
                for (int i = 0; i < 10; i++) {
                    Log.i("md", "Thread" + id + ": " + i);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

打印结果为:

代码语言:javascript
复制
Thread2: 1
Thread1: 1
Thread2: 2
Thread1: 2
Thread2: 3
Thread1: 3
Thread2: 4
Thread1: 4
Thread2: 5
Thread1: 5
Thread2: 6
Thread1: 6
Thread2: 7
Thread2: 8
Thread2: 9
Thread2: 10
Thread1: 7
Thread1: 8
Thread1: 9
Thread1: 10

从这个例子可以看出当线程未设置优先级时,是交叉运行的!


2.设置线程优先

当我们加了

代码语言:javascript
复制
thread2.setPriority(Thread.MAX_PRIORITY);
    thread1.setPriority(Thread.MIN_PRIORITY);

打印结果为:

代码语言:javascript
复制
Thread1: 1
Thread1: 2
Thread1: 3
Thread1: 4
Thread1: 5
Thread1: 6
Thread1: 7
Thread1: 8
Thread1: 9
Thread1: 10
Thread2: 1
Thread2: 2
Thread2: 3
Thread2: 4
Thread2: 5
Thread2: 6
Thread2: 7
Thread2: 8
Thread2: 9
Thread2: 10

3.其他
  • 不过也不一定,在不同的机器上有可能是不一样的,如果物理操作系统的优先级如果少于java的优先级的话,那么java中某两个优先级,在系统中应该对应的是相同的数值,也就是在操作系统中优先级是相同。
  • 所以Thread.setPriority()可能根本不做任何事情,这跟你的操作系统和虚拟机版本有关
  • 线程优先级对于不同的线程调度器可能有不同的含义,可能并不是你直观的推测。特别地,优先级并不一定是指CPU的分享。在UNIX系统,优先级或多或少可以认为是CPU的分配,但Windows不是这样
  • 线程的优先级通常是全局的和局部的优先级设定的组合。Java的setPriority()方法只应用于局部的优先级。换句话说,你不能在整个可能的范围 内设定优先级。(这通常是一种保护的方式,你大概不希望鼠标指针的线程或者处理音频数据的线程被其它随机的用户线程所抢占)
  • 不同的系统有不同的线程优先级的取值范围,但是Java定义了10个级别(1-10)。这样就有可能出现几个线程在一个操作系统里有不同的优先级,在另外一个操作系统里却有相同的优先级(并因此可能有意想不到的行为)
  • 操作系统可能(并通常这么做)根据线程的优先级给线程添加一些专有的行为(例如”only give a quantum boost if the priority is below X“)。这里再重复一次,优先级的定义有部分在不同系统间有差别。
  • 大多数操作系统的线程调度器实际上执行的是在战略的角度上对线程的优先级做临时操作(例如当一个线程接收到它所等待的一个事件或者I/O),通常操作系统知道最多,试图手工控制优先级可能只会干扰这个系统。
  • 你的应用程序通常不知道有哪些其它进程运行的线程,所以对于整个系统来说,变更一个线程的优先级所带来的影响是难于预测的。例如你可能发现,你有一个预期 为偶尔在后台运行的低优先级的线程几乎没有运行,原因是一个病毒监控程序在一个稍微高一点的优先级(但仍然低于普通的优先级)上运行,并且无法预计你程序 的性能,它会根据你的客户使用的防病毒程序不同而不同。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 项勇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 地址
  • 前言
  • 目录
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档