多线程基础学习

返回主页面

调度的优先级(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-----

原文地址:https://www.cnblogs.com/tianzhiyun/p/9389947.html