• 多线程基础学习


    返回主页面

    调度的优先级(Priority)

    实验仅证明优先级设置的比较高并不一定先执行,

     * 线程的优先级仍然无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行。

     * 线程的优先级具有继承性,比如A线程启动B线程,则A和B的线程优先级是一样的。

    package com.qdb.thinkv.thread.base;
    
    import java.util.Random;
    /**
     * 以下实验仅证明优先级设置的比较高并不一定先执行,
     * 线程的优先级仍然无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行。
     * 线程的优先级具有继承性,比如A线程启动B线程,则A和B的线程优先级是一样的。
    
     *
     */
    public class ThreadProiority {
        static class ThreadA extends Thread{
            public void run(){
                long startTime=System.currentTimeMillis();  
                long addResult=0;  
                for (int i = 0; i < 1000000; i++) {  
                    new Random().nextInt();  
                    addResult+=i;  
                }  
                long endTime=System.currentTimeMillis();  
                System.out.println("thread1 use time--->"+(endTime-startTime));  
            }
        }
        
        static class ThreadB extends Thread{
            public void run(){
                long startTime=System.currentTimeMillis();  
                long addResult=0;  
                for (int i = 0; i < 1000000; i++) {  
                    new Random().nextInt();  
                    addResult+=i;  
                }  
                long endTime=System.currentTimeMillis();  
                System.out.println("thread2 use time--->"+(endTime-startTime));  
            }
        }
        
        public static void main(String[] args) throws InterruptedException {
            for(int i=0;i<5;i++){
                Thread t1=new ThreadA();
                t1.setPriority(10);
                t1.start();
                Thread t2=new ThreadB();
                t2.setPriority(1);
                t2.start();
            }
        }
    }

     运行结果

    线程状态


    1. 新建( new ):新创建了一个线程对象。

    2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。

    3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码。

    4. 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。阻塞的情况分三种:

    (一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。

    (二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。

    (三). 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。            当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。

    5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

    1. 疑问只有5种状态吗?

    2. wait是什么情况?

    https://blog.csdn.net/pange1991/article/details/53860651p0-----

  • 相关阅读:
    OC核心语法之构造方法、Category分类、类的本质、description和SEL
    OC核心语法之NSString、点语法、成员变量作用域、@property和@synthesize
    OC基本语法、类和对象、三大特性
    C语言基础之结构体、枚举、预处理、typedef的使用
    C语言基础之复杂数据类型的学习
    v880 debug
    JQuery的一些简单操作02
    JQuery的一些简单操作01
    学习SVG系列(5):SVG渐变
    学习SVG系列(4):SVG滤镜效果
  • 原文地址:https://www.cnblogs.com/tianzhiyun/p/9389947.html
Copyright © 2020-2023  润新知