Java中多线程二

抢占调度模型

  • 概述:优先让优先级高的线程使用 CPU ,如果线程的优先级相同,那么随机会选择一个,优先级高的线程获取的 CPU 时间片相对多一些

  • Thread 类中一些关于线程的方法

    方法简述
    public final int getPriority()返回此线程的优先级
    public final void setPriority(int newPriority)设置此线程的优先级
  • 线程的优先级

    • 范围:从 1~10,线程默认优先级:5
    • 线程优先级高,仅仅表示线程获取CPU的时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到你想要的效果
    class MyThread extends Thread{
        private int val;
        public MyThread(int val){
            this.val = val;
        }
        @Override
        public void run() {
            System.out.println(val);
        }
    }
    
    public class Test1 {
        public static void main(String[] args) {
            // 创建线程对象
            MyThread m1 = new MyThread(1);
            MyThread m2 = new MyThread(2);
            MyThread m3 = new MyThread(3);
            MyThread m4 = new MyThread(4);
            // 展示线程对象的优先级
            System.out.println("m1:" + m1.getPriority() + "\nm2:" + m2.getPriority()
                 + "\nm3:" + m3.getPriority() + "\nm4:" + m4.getPriority());
            // 设置优先级
            m1.setPriority(10);
            m2.setPriority(8);
            m3.setPriority(6);
            m4.setPriority(4);
            // 启动线程,查看结果
            m1.start();
            m2.start();
            m3.start();
            m4.start();
        }
    }
    

    注意:按照我们设置的优先级,m1 线程 抢到的几率是最高的,依次向下,但是,一定输出 1 2 3 4吗,不一定的,我们只是说,抢占的几率。

线程生命周期

  • 概述:线程的生命周期分为 4 个

    • 新建 (创建线程对象)
    • 就绪 (有执行资格,没有执行权)【举个简单的例子:商家有了营业资格证,但是他一定能在有证的那一刻营业吗】
    • 运行 (有执行资格,有执行权)
    • 死亡 (线程死亡,变成垃圾)
  • 生命周期图

    如果上述还未理解,我们结合这个例子看下:有个大型演唱会,邀请了很多明星(可理解为创建了对象),但是舞台呢,在某一时刻只允许一位明星表演,那在后边等待的人(有资格表演,但是现在没有权力登台),接着轮到这个明星(此时他既有资格,又有权力),如果顺利演唱结束(那就没他啥事了),但是如果突然他被爆料,那停止他的资格和执行权,直到查清后,他重新拥有资格,等待表演。

线程的一些控制方法

方法简述
static void sleep(long millis)使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性
void join()等待这个线程死亡。
public final void setDaemon(boolean on)如果 true ,将此线程标记为守护线程 将此线程标记为daemon线程或用户线程。 当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。 线程启动前必须调用此方法。
案例一:让线程睡一会
public class Test2 {
    public static void main(String[] args) throws InterruptedException {
        printSlowly("你好,中国!欢迎来到编程世界!....",300);
    }

    public static void printSlowly(String text , long time) throws InterruptedException {
        // 字符串转换成字符数组
        for (char ch : text.toCharArray() ) {
            // 每打一个字,休息 0.3 秒
            Thread.sleep(time);
            System.out.print(ch);
        }
    }
}

运行上述程序,会出现 有趣的现象,大家可以运行看一下!

案例二:执行1秒就停了
import java.util.concurrent.TimeUnit;
public class Test3 {
    public static void main(String[] args) throws InterruptedException {
        String s = "欢迎来到编程世界,小哼与你一同学习,进步!";
        // 输出当前线程的名字
        System.out.println("程序开始执行,当前线程名:" + Thread.currentThread().getName());

        for (int i = 1; i <= 1 ; i++) {
            Thread thread = new Thread(new MyRunnable(s,200),"我的线程==" + i);

            // 设置为守护线程
            thread.setDaemon(true);

            thread.start();
        }
        // 参数意思:将 5 秒转换成 毫秒
        Thread.sleep(TimeUnit.SECONDS.toMillis(1));			// 运行后注释这行再试下
    }

    static class MyRunnable implements Runnable{
        private String text;
        private long time;

        public MyRunnable(String text , long time){
            this.text = text;
            this.time = time;
        }

        @Override
        public void run() {
            try {
                printSlowly(text,time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void printSlowly(String text , long time) throws InterruptedException {
        for (char ch : text.toCharArray()) {
            Thread.sleep(time);
            System.out.print(ch);
        }
    }
}

注意:我们运行程序,可以发现,设置为守护线程,当前线程只剩守护线程,会直接结束程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/311120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

五、Java中SpringBoot组件集成接入【slf4j日志文档】

五、Java中SpringBoot组件集成接入【slf4j日志文档】 1.slf4j简介2.maven依赖3.配置4.使用5.展示6.参考文章 1.slf4j简介 SLF4J&#xff08;Simple Logging Facade for Java&#xff09;是一个为Java应用程序提供统一日志接口的日志门面框架。它旨在解决Java应用程序中日志系统…

居中面试问题

前端常问居中面试问题 css文本居中 文本水平居中 <div class"father"><div class"child"><div> <div>子类元素为行内元素&#xff0c;则给父类元素定义text-align:center 如果子元素是块元素&#xff0c;则给子元素定义margin&…

Vue3快速入门

文章目录 1. Vue3简介1.1. 【性能的提升】1.2. 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options API 的…

Linux系统——测试端口连通性方法

目录 一、TCP端口连通性测试 1、ssh 2、telnet&#xff08;可能需要安装&#xff09; 3、curl 4、tcping&#xff08;需要安装&#xff09; 5、nc&#xff08;需要安装&#xff09; 6、nmap&#xff08;需要安装&#xff09; 二、UDP端口连通性测试 1、nc&#xff08;…

85.乐理基础-记号篇-速度记号

内容来源于&#xff1a;三分钟音乐社 上一个内容&#xff1a;85.乐理基础-记号篇-力度记号-CSDN博客 速度记号在下方两个里面已经写过一部分了&#xff0c;这些标记总体上是属于 不变速度 的标记&#xff0c;比如一首乐谱就记了 每分钟60拍&#xff0c;那整首速度就都是不变的…

org.springframework.web.servlet.HandlerInterceptor

过期 1 配置黑名单 2 启动注册拦截 3 浏览器访问拦截

【Spring Cloud】Sentinel流量限流和熔断降级的讲解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Cloud》。&#x1f3af;&#x1f3af; &am…

【SAP-PP】生产订单导入问题--完成日期向前推了一天

问题描述&#xff1a; 在执行BAPI_PRODORD_CREATE生产订单导入的时候&#xff0c;发现填写入模板中的基本完成日期是12月31日&#xff0c;但是到具体工单时变成了12月30日 截图说明&#xff1a; 感觉很神奇&#xff0c;咋一看&#xff0c;真的是日期提前了一天&#xff0c;de…

线性回归实例

1、线性回归&#xff08;linear Regression&#xff09;和逻辑回归&#xff08;logistic Regression&#xff09;的区别 线性回归主要是用来拟合数据&#xff0c;逻辑回归主要是用来区分数据&#xff0c;找到决策边界。 线性回归的代价函数常用平方误差函数&#xff0c;逻辑回…

函数指针和回调函数

文章目录 一.函数指针1.什么是函数指针2.函数指针的形式3.函数指针的用途。1.调用函数2.作为参数进行传递 二.函数指针数组三.回调函数 一.函数指针 1.什么是函数指针 函数指针是指向函数的指针。在C语言和C中&#xff0c;函数指针可以用来存储函数的地址&#xff0c;并且可以…

Kotlin程序设计(二)面向对象

Kotlin程序设计中级篇 我们在前面已经学习了Kotlin程序设计的基础篇&#xff0c;本章我们将继续介绍更多Kotlin特性&#xff0c;以及面向对象编程。 函数 其实函数我们在一开始就在使用了&#xff1a; fun main() {println("Hello World") }我们程序的入口点就是…

恒创科技:解决Windows服务器磁盘空间不足的问题

​  服务器硬盘的大小是决定空间是否充足的主要因素。但在日常使用中&#xff0c;服务器和网站备份会消耗大量存储空间&#xff0c;如果维护不当&#xff0c;最终将耗尽您的容量。同样&#xff0c;日志文件、临时文件和数据库可以在硬盘驱动器上或回收站中无休止地建立。当您…

windows10使用Shift+Win+S快捷键来截图

有时候电脑上没有打开微信QQ等软件&#xff0c;但是想使用一下截图&#xff0c;就很麻烦&#xff0c;还好windows10开始已经支持快捷键截图了&#xff1a; 打开截图工具并获取屏幕截图 - Microsoft 支持 快捷键&#xff1a;ShiftWinS 使用教程&#xff1a; 顺带说下系统这个自…

Mingw32编译opencv库

文章目录 1. 准备工作2. 编译cmake构建程序mingw32-make编译 3. 安装4. 安装完的结果 注意&#xff1a; mingw32-make编译的库和MSVC编译的库不兼容&#xff0c;MSVC和mingw-make生成的动态库使用的是不同的ABI&#xff08;Application Binary Interface&#xff09;&#xff0…

货拉拉智能监控实践:如何解决多云架构下的故障应急问题?

一分钟精华速览 在月活超千万的大规模业务背景下&#xff0c;货拉拉遭遇了多云环境下的监控碎片化、规划无序等问题。为了应对这些挑战&#xff0c;货拉拉开发了一站式监控平台——Monitor。该平台的部署有效地实现了对核心应用的监控和报警全覆盖&#xff0c;显著提高了应急响…

【算法Hot100系列】组合总和

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【算法】七夕祭

题目 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。 于是 TYVJ 今年举办了一次线下七夕祭。 Vani 同学今年成功邀请到了 cl 同学陪他来共度七夕&#xff0c;于是他们决定去 TYVJ 七夕祭游玩。 TYVJ 七夕祭和 11 区的夏祭的形式很像。 矩形的祭典会场由 N 排 M 列共…

作业--day45

定时播放 #include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent) :QWidget(parent),ui(new Ui::MyWidget) {ui->setupUi(this);ui->bg_lab->setPixmap(QPixmap(":/pictrue/shanChuan.jpg"));ui->bg_…

装饰器模式

装饰器模式 什么是装饰器模式: 是一种结构型设计模型&#xff0c;允许在不改变对象结构的情况下&#xff0c;动态的将新的功能添加到对象上&#xff0c; 核心思想&#xff1a; 通过组合而非继承的方式来实现功能的扩展。他可以在运行时动态的添加活移除对象的功能&#xff…

刷题第十六天-扰乱字符串

扰乱字符串 题目要求 解题思路 初步分析 给定两个字符串T和S&#xff0c;假设T是由S变换而来的 如果T和S长度不一样&#xff0c;必定不能变来如果长度一样&#xff0c;顶层字符串S能够划分 S 1 S_1 S1​和 S 2 S_2 S2​&#xff0c;同样字符串T也能够划分为 T 1 T_1 T1​和…