我是靠谱客的博主 懵懂母鸡,最近开发中收集的这篇文章主要介绍线程的状态与调度,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线程的运行状态

一个线程从创建、运行到结束总是处于下面的六种状态之一,这些状态的值被封装在java.lang.Thread.State枚举中:
     - NEW:新建状态。空的线程对象,系统并没有为其分配资源;此时仅可以启动线程,调用任何其他方法都是无意义的,并且会引发IllegalThreadStateException异常
     - RUNNABLE:可运行状态。当处于新建状态的进程调用了start方法并**返回后**,线程处于该状态。(处于可运行状态的线程并不一定立即运行run方法,线程还必须与其他线程竞争CPU时间,只有获得CPU时间才可以运行进程)
     - BLOCKED:阻塞状态。正在运行的线程没有运行结束,暂时让出CPU时间,此时其他处于可运行状态的线程就可以获得CPU时间。(处于阻塞状态的原因有很多,如缺少某种资源等)
     - WAITING:无限期等待状态。当线程调用wait方法时进入该状态,直到另一个线程调用了该对象的notify方法或notifyAll方法
     - TIMED_WAITING:等待指定时间状态。当线程调用sleep方法时线程进入该状态,在指定时间过后线程再次进入可运行状态。
     - TERMINATED:结束状态。线程正常结束,即run方法返回,线程运行就结束了。

线程的优先级和调度

每个线程都有一个优先级,当多个线程处于可运行状态时,线程调度器根据线程的优先级调度线程运行,设置和返回优先级的方法如下:
    public final void setPriority(int newPriority) //设置线程的优先级
    public final int getPriority() //返回线程的优先级
    /**
     * 优先级取值为1~10的整数,数值越大优先级越高。
     * 也可以使用Thread类定义的常量来设置线程的优先级,
     * MIN_PRIORITY、NORM_PRIORITY、MAX_PRIORITY
     * 优先级分别对应于1、5、10
     * 创建线程时如果没有指定优先级,则从创建该线程那里继承优先级
     * 一般来说,只有当线程停止运行或由于某种原因被阻塞,较低优先级的线程才有机会运行。
     */
代码示例:
`
public class ThreadDemo extends Thread{
ThreadDemo(String name){
    super(name);
}
@Override
public void run() {
    // TODO Auto-generated method stub
    for (int i = 0; i < 10; i++) {
        System.out.println(getName() + ":" + i);
        try {
            Thread.sleep((int)Math.random()*100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    System.out.println(getName() + "结束.");
}

public static void main(String[] args) {
    ThreadDemo t1 = new ThreadDemo("线程A");
    ThreadDemo t2 = new ThreadDemo("线程B");
    t1.setPriority(MAX_PRIORITY);
    t2.setPriority(NORM_PRIORITY);
    t1.start();
    t2.start();
    }
}
`
运行结果:`
    线程A:0
    线程B:0
    线程A:1
    ...
    线程A:9
    线程B:1
    线程A结束.
    线程B:2
    ...
    线程B:9
    线程B结束.`

线程A应该先结束,因为它的优先级高,会获得较多的CPU时间执行。

控制线程的结束

1. 如果run方法是一个确定次数的循环,当run方法结束后,线程运行就结束了。
2. 如果run方法是一个不确定循环,
    如`public void run () {
            while (true) { }
        }
    可以在程序中通过改变标志变量的值实现结束进程。
        new Runnable{
            boolean flag = true;
            public void run () {
                while (flag) {
                    //关键代码
                }
            }
            public void stopRun () { flag = false; }
        }
`

最后

以上就是懵懂母鸡为你收集整理的线程的状态与调度的全部内容,希望文章能够帮你解决线程的状态与调度所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部