ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java基础——线程调度

2022-04-13 19:01:56  阅读:159  来源: 互联网

标签:Java void 调度 mt MyThread 线程 优先级 public


一、线程的两种调度模型:

1.分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片

2.抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一点(Java使用的就是抢占式调度模型)

为什么说抢占式调度模型多线程的执行具有随机性?

假设某台计算机只有一个CPU,那么CPU在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权才能执行指令,所以多线程程序执行是具有随机性的,因为不确定谁可以抢到CPU的使用权

二、Thread类中设置和获取线程优先级的方法

设置优先级:public final void setPriority(int newpriority):更改此线程优先级

获取线程优先级:public final int getPriority():返回此线程的优先级

//优先级从1-10,数字越大,优先级越高
//优先级从1-10,数字越大,优先级越高
//线程默认的优先级是5,范围是1-10
//优先级越高只是代表获得CPU时间片的几率高,并不能确保优先级高的线程全部领先完成
public class MyThreadDemo {
  public static void main(String[] args) {
      MyThread mt=new MyThread("兔子");
      MyThread mt1=new MyThread("乌龟");
      //public final int getPriority():返回此线程的优先级
//       System.out.println(mt.getPriority());
//       System.out.println(mt.getPriority());
      //public final void setPriority(int newpriority):更改此线程优先级
      mt.setPriority(10);//优先级从1-10,数字越大,优先级越高
      mt.setPriority(1);//优先级从1-10,数字越大,优先级越高
      //优先级越高只是代表获得CPU时间片的几率高,并不能确保优先级高的线程全部领先完成
      mt.start();
      mt1.start();
  }
}

三、线程控制

方法名说明
static void sleep(long millis) 使得当前正在执行的线程停留(暂停执行)所设置的毫秒数
void join() 等待这个线程的死亡
void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出

sleep方法代码

public class ThreadSleep extends  Thread {
  //无参,带参构造
  public ThreadSleep(){}
  public ThreadSleep(String name){
      super(name );
  }
  //重写run方法


  @Override
  public void run() {
      for (int i=0;i<100;i++){
          //使用getName()获取线程名称
          System.out.println(getName()+":"+i);
          //让线程每次执行完毕就休眠1000毫秒
          try {
              sleep(1000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }

  }
}
/*
* static void sleep(long millis)使得当前正在执行的线程停留(暂停执行)所设置的毫秒数*/
public class ThreadSleepDemo {
  public static void main(String[] args) {
      MyThread mt=new MyThread("张三");
      MyThread mt1=new MyThread("李四");
      MyThread mt2=new MyThread("王五");
      mt.start();
      mt1.start();
      mt2.start();
  }
}

join方法:

作用:可以让某一个线程执行完毕后再开始其他线程

public class ThreadJoin extends Thread{
  //无参,带参构造
  public ThreadJoin(){}
  public ThreadJoin(String name){
      super(name );
  }
  //重写run方法
  @Override
  public void run() {
      for (int i=0;i<100;i++){
          //使用getName()获取线程名称
          System.out.println(getName()+":"+i);

      }

  }
}
public class ThreadJoinDemo {
  public static void main(String[] args) {
      MyThread mt=new MyThread("张三");
      MyThread mt1=new MyThread("李四");
      MyThread mt2=new MyThread("王五");
      mt.start();
      try {
          mt.join();
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
      mt1.start();
      mt2.start();
  }
}

void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出

简单来说比如有三个线程,一个主线程名字为爹,两个线程名字为儿子,当把两个儿子线程设置为守护线程后,当爹线程完成了任务消失后,两个儿子线程不管执行到了哪里会直接消失

public class ThreadDaemon extends Thread{
  //无参,带参构造
  public ThreadDaemon(){}
  public ThreadDaemon(String name){
      super(name );
  }
  //重写run方法
  @Override
  public void run() {
      for (int i=0;i<100;i++){
          //使用getName()获取线程名称
          System.out.println(getName()+":"+i);

      }

  }
}
public class ThreadDaemDemo {
  public static void main(String[] args) {
      MyThread mt = new MyThread("儿子一");
      MyThread mt1 = new MyThread("儿子二");
      //设置一个主线程
      Thread.currentThread().setName("爹");
      //设置两个守护线程
      mt.setDaemon(true);
      mt1.setDaemon(true);
      mt.start();
      mt1.start();
      //设置主线程需要执行的步骤
      for (int i = 0; i < 5; i++) {
          System.out.println(Thread.currentThread().getName() + "," + i);
      }
  }
}

四、线程的生命周期

 

标签:Java,void,调度,mt,MyThread,线程,优先级,public
来源: https://www.cnblogs.com/CYan521/p/16141638.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有