线程随机性

news2024/9/19 10:51:51

目录

线程随机性的展现

执行start()的顺序不代表执行run()的顺序


在使用多线程技术时,代码运行的结果与代码执行顺序或者调用顺序无关。线程是一个子任务,而CPU是以不确定的方式,或者说是以随机的时间来调用线程中的run方法的。所以说线程执行顺序具有随机性。

线程随机性的展现

package ChapterOne.test;

import ChapterOne.myThread.MyThread;

public class Test {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.setName("myThread");
        thread.start();
        for (int i = 0; i < 100000; i++) {
            System.out.println("main= "+ Thread.currentThread().getName());
        }
    }
}
package ChapterOne.myThread;

public class MyThread extends Thread{
    @Override
   public void run(){
        for (int i = 0; i < 10000; i++) {
            System.out.println("run= "+ Thread.currentThread().getName());
        }
   }
}

运行结果:

start()方法告诉”线程规划器“,该线程已经准备就绪。这里就是让操作系统安排一个时间来调用run()方法执行具体的任务,具有异步随机顺序执行的特点。

多线程随机输出的原因是CPU将时间片分给不同的线程,线程获得时间片后执行相应任务,所以这些线程在交替执行输出,导致上述的输出结果乱序。

时间片就是CPU分配给各个程序的时间,每个线程被分配一个时间片,在当前的时间片内执行线程中对应的任务。注意,当CPU在不同线程上进行切换时是需要耗时的,因此创建的线程越多,运行效率越慢。

如果调用的方法不是thread.start()而是thread.run(),这里就不是异步执行了,而是同步执行。此时,该线程对象就不交给线程规划器来处理了,而是由main线程直接调用run()方法。同步执行的情况下,需要等待run()方法中的代码执行完毕再执行后面的代码。

执行start()的顺序不代表执行run()的顺序

"start()"方法是Java中线程类的一个方法,用于启动一个新的线程。当调用`start()`方法时,JVM会创建一个新的线程,并将该线程放入就绪状态。但是,这并不意味着该线程立即开始执行。实际上,JVM会在适当的时间运行该线程。因此,`start()`方法只是通知JVM在一个合适的时间运行该线程。

执行run()方法的顺序是随机的。

package ChapterOne.test;

public class MyThread extends Thread{
    private int i;
    public MyThread(int i){
        super();
        this.i = i;
    }
    @Override
    public void run(){
        System.out.println(i);
    }
}
package ChapterOne.test;

public class Test {
    public static void main(String[] args) {
        MyThread tl1 = new MyThread(1);
        MyThread tl2 = new MyThread(2);
        MyThread tl3 = new MyThread(3);
        MyThread tl4 = new MyThread(4);
        MyThread tl5 = new MyThread(5);
        MyThread tl6 = new MyThread(6);
        MyThread tl7 = new MyThread(7);
        MyThread tl8 = new MyThread(8);
        MyThread tl9 = new MyThread(9);
        MyThread tl10 = new MyThread(10);
        
        tl1.start();
        tl2.start();
        tl3.start();
        tl4.start();
        tl5.start();
        tl6.start();
        tl7.start();
        tl8.start();
        tl9.start();
        tl10.start();
    }
}

运行结果:

上述结果说明执行start()方法的顺序不代表run()方法的顺序。这从另一个方面也说明了线程是随机执行的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nvm 下载nodejs 失败

解决办法&#xff1a; 1.查看nvm安装路径 nvm root2、在安装路径下找到setting.txt,添加两句话 node_mirror: http://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/3.再执行nvm install 就可以了。

【uniapp开发小程序】实现读取手机剪切板第一条,识别并以姓名/手机号/收货地址格式输出

效果图&#xff1a; 完整代码&#xff1a; <template><view class""><text>测试</text><view click"pasteContent()" class"content">点击此处可快速识别 您的收货信息</view></view> </templat…

使用chatGPT + AI 绘图生成自己的专属头像

案例介绍 微信头像是朋友认识我们时的第一印象,或许是可爱、妖娆,或许是帅气、成熟,还有自然、厚重、调皮… 我们都有自己独特的故事,独特的思想,独特的爱好,对于头像当然有着自己独到的设计眼光。 接下来请允许我向大家展示如何使用chatGPT、AI绘图工具生成出自己的专属…

【vue学习】权限管理系统前端实现6-主页面布局

1.新建layout文件夹 新建index.vue 添加router const routes [{path: /,name: 首页,component: () > import(../layout)}, 2.登录添加跳转 loginRef.value.validate(async (valid)>{if(valid){try{let resultawait requestUtil.post("login?"qs.stringify(l…

人工智能面试总结-Transformer专题

B站:啥都会一点的研究生 公众号试读:啥都会一点的研究生 目录 说说什么是Transformer?说说Transformer中的Encoder?说说Transformer中的Decoder?说说Transformer在训练与测试阶段Decoder的输入、输出是什么?说说Transformer Encoder和Decoder有哪些不同?说说什么是Tran…

Qt/C++原创项目作品精选(祖传原创/性能凶残)

00 前言说明 从事Qt开发十年有余&#xff0c;一开始是做C#.NET开发的&#xff0c;因为项目需要&#xff0c;转行做嵌入式linux开发&#xff0c;在嵌入式linux上做可视化界面开发一般首选Qt&#xff0c;当然现在可选的方案很多比如安卓&#xff0c;但是十多年前那时候板子性能低…

松下|PCB焊盘脱落常见的几个原因分析

PCB焊盘脱落是电子制造中常见的问题之一&#xff0c;它会导致电路板的性能下降或完全失效。本文将从几个常见原因来分析PCB焊盘脱落的原因&#xff0c;并提供一些预防措施。 一、设计问题 PCB焊盘脱落的一个常见原因是设计问题。一些设计错误可能会导致焊盘的结构不稳定&…

QCC51XX---SPI使用

QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客 了解了I2C的使用,细心的小伙伴已经发现了,在bitserial这个功能里面还能使用SPI。bitserial就是用来使用I2C和SPI的,而这两者的使用,大同小异。 在默认代码使中,是有两个传感器的驱动代码的,分别是加速度传感器ad…

若依@DataScope

DataScope &#xff1a; 根据sys_role 中的 data_scope中的值&#xff0c;来设置数据该怎么过滤&#xff0c;&#xff0c; data_scope 取值&#xff1a; 1 &#xff1a; 不需要过滤2 &#xff1a; 自定义过滤 &#xff1a; 根据 sys_role_dept 这个表关联出来的 dept_id 过滤…

五.LLC谐振变换器

LLC 谐振变换器启动过程分析 LLC 谐振变换器的组成结构中包含容性器件&#xff0c;为了尽可能减小输出电压纹波&#xff0c;钳位输出电压&#xff0c;此时希望输出滤波电容尽可能的大&#xff0c;因此也会在启动的时候&#xff0c;电容两端电压近似为 0&#xff0c;系统对电容…

Final2x-开源图片无损放大工具 提升分辨率到任意尺寸

一、Final2x是什么 Final2x是一款开源、跨平台的图片无损放大工具&#xff0c;内置多个模型&#xff0c;能够将图片提升分辨率到任意尺寸&#xff0c;增强图像的分辨率和质量&#xff0c;使图像更清晰、更详细。目前支持RealCUGAN、RealESRGAN、Waifu2x、SRMD等多种模型。支持…

不会写代码,咋做爬虫

随着时代的发展&#xff0c;大数据越来越重要&#xff0c;数据获取很关键 提到数据获取大家应该都会想到爬虫&#xff0c;但是我不会写代码怎么玩爬虫 今天给大家分享一个不会代码也可以进行爬虫的工具&#xff0c;实现无代码进行数据获取 强调 这里介绍的工具大家合理合法使用…

使用黑盒测试在 Go 中重写 Bash 脚本

目录 前言&#xff1a; 开始 准备工作 描述行为&#xff1a;Bats 简介 行为描述&#xff1a;陷阱 描述行为&#xff1a;设计测试 重写&#xff1a;让我们开始用go吧&#xff01; 重构和更新&#xff1a;实现胜利 结论 前言&#xff1a; 使用黑盒测试在Go中重写Bash脚本…

Linux bio数据结构

数据结构 /** main unit of I/O for the block layer and lower layers (ie drivers and* stacking drivers)*/ struct bio {struct bio *bi_next; /* request queue link */struct gendisk *bi_disk;unsigned int bi_opf; /* bottom bits req flags,* top bits REQ_OP. Us…

go入门demo

go快速学习&#xff1a; 官网学习方案&#xff08;选择自己喜欢的语言&#xff09;&#xff1a;A Tour of Go 视频:B站是个不错的选择 &#xff08;转go入门使用&#xff09;推荐视频&#xff1a;1-课程需知与课程提纲_哔哩哔哩_bilibili1-课程需知与课程提纲是8小时转职Gol…

把握住golang中的template,方能驾驭得了Hugo主题的template

笔者小站&#xff1a;秋码记录 不置可否&#xff0c;Hugo的template同样是使用golang的标准库html/template。为了能实现一个属于自己独特的Hugo theme&#xff0c;或是修改他人的主题&#xff0c;都得对其模板语法有所知晓&#xff0c;方能改的称心如意&#xff0c;亦或是制作…

HarmonyOS学习路之开发篇—数据管理(融合搜索)

融合搜索概述 HarmonyOS融合搜索为开发者提供搜索引擎级的全文搜索能力&#xff0c;可支持应用内搜索和系统全局搜索&#xff0c;为用户提供更加准确、高效的搜索体验。 基本概念 全文索引 记录字或词的位置和次数等属性&#xff0c;建立的倒排索引。 全文搜索 通过全文索引进…

GEE:哨兵数据时间序列计算物候时期EOS/SOS

作者&#xff1a;CSDN _养乐多_ 本文将介绍使用哨兵数据时间序列计算植被物候时期EOS/SOS的代码。 文章目录 一、需要代码请私聊二、代码三、代码链接 一、需要代码请私聊 二、代码 //待更新 三、代码链接 //待更新 声明&#xff1a; 本人作为一名作者&#xff0c;非常重…

11 Java的三元运算符使用

三元运算符使用规则&#xff1a; 关系表达式 ? 表达式1 : 表达式2; 如果关系表达式成立&#xff0c;则结果是表达式1&#xff0c;如果不成立&#xff0c;则结果为表达式2。 package demo;public class Demo1 {public static void main(String[] args) {int a 20;int b 30;i…

基于simulink使用二维规范化互相关进行模式匹配和目标跟踪(附源码)

一、前言 此示例演示如何使用二维规范化互相关进行模式匹配和目标跟踪。双击“编辑参数”块以选择要检测的类似目标的数量。您还可以更改金字塔因子。通过增加它&#xff0c;您可以更快地将目标模板与每个视频帧匹配。更改金字塔因子可能需要更改阈值。 此外&#xff0c;还可…