操作系统_多线程笔记(二)

news/2024/4/20 16:13:30/文章来源:https://blog.csdn.net/weixin_64634186/article/details/128106538

文章目录

  • 1.线程状态
  • 2.多线程在的意义是什么?

1.线程状态

状态是针对当前线程调度的情况来描述的,因为线程是系统调度的基本单位,所以状态是属于线程的属性
线程的六种状态:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:
1.一旦内核里的PCB消亡了,此时代码中创建的thread也就没有用了,即内核里的线程释放的时候无法保证java代码中的对象也被释放,所以就需要设定特定的状态来把thread对象来标记成"无效";
2.PCB消亡之后,还可以调用对象的一些方法属性,只是没有办法再利用多线程来做事情了;
3.一个线程只能start一次

看代码举例:

 public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {for (int i = 0; i < 100; i++) {try {sleep(10);//休眠10ms} catch (InterruptedException e) {throw new RuntimeException(e);}}});System.out.println("start之前的状态:"+thread.getState());//获取PCB还没形成之前的状态thread.start();//PCB形成,线程开始工作System.out.println("thread执行中的状态:"+thread.getState());//获取线程工作中的状态thread.join();//main主线程等待thread线程工作完System.out.println("thread执行完的状态:"+thread.getState());//获取thread线程工作完之后,thread线程的状态}

结果:
在这里插入图片描述

例二:

public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {for (int i = 0; i < 100; i++) {// 这个循环体啥都不干, 也不 sleepfor (int j = 0; j < 100; j++) {int a = 10;a += 10;}try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();for (int i = 0; i < 1000; i++) {System.out.println("t 执行中的状态: " + t.getState());}}

结果:
在这里插入图片描述
通过这里的循环获取,就能够看到这里的交替状态了,当前获取到的状态是什么,主要看系统里的操作系统的调度,获取状态的那一瞬间是什么就是什么(正在执行或者sleep)
拿例二举例:相比于thread在cpu上的执行时间,sleep这个时间太长了
在这里插入图片描述
如果想让时间更均衡,可以给线程增加更复杂的逻辑


2.多线程在的意义是什么?

看例子:
计算a自增10000次,和b自增10000所用的时间; 分别用单线程和多线程来感受一下

//多线程执行public static void concurrency() {Thread thread1 = new Thread(() -> {int a = 0;for (long i = 0; i < 100_0000_0000L; i++) {a++;}});Thread thread2 = new Thread(() -> {int b = 0;for (long i = 0; i < 100_0000_0000L; i++) {b++;}});long s1 = System.currentTimeMillis();thread1.start();thread2.start();try {thread1.join();thread2.join();} catch (InterruptedException e) {throw new RuntimeException(e);}long s2 = System.currentTimeMillis();System.out.println("并发执行所消耗的时间:"+(s2-s1)+"ms");}//单线程执行public static void serial() {long s1 = System.currentTimeMillis();long a = 0;for (long i = 0; i < 100_0000_0000L; i++) {a++;}long b = 0;for (long i = 0; i < 100_0000_0000L; i++) {b++;}long s2 = System.currentTimeMillis();System.out.println("执行时间: " + (s2 - s1) + " ms");}public static void main(String[] args) throws InterruptedException {concurrency();//多线程执行serial();//单线程执行}

结果:
在这里插入图片描述
可以看出单线程执行的时间比多线程慢的多!

问题一: 但是为什么多线程的执行时间不是单线程的两倍呢?
因为线程的调度也是会消耗时间的!,多线程可以更充分的利用CPU的资源
问题二: 两个线程是不是同时执行?
main线程先调用thread1.start,启动thread1开始计算时间的同时main再调用thread2.start,启动thread2的同时main线程就进入thread1.join,此时main线程阻塞等待,thread1和thread2还是继续执行的;等到thread.join返回,在进入main线程就进入thread2.join阻塞等待thread2join返回,继续执行计时操作,值得注意的是虽然thread2比thread1start的晚一点,但是thread2 完全有可能比thread1先结束,这样下来就是main在thread1.join是还是正常等待
注意:
main线程调用thread1.join就是main等待thread1执行完

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

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

相关文章

信号包络及其提取方法(Matlab)

信号包络及其提取方法 介绍信号包络&#xff0c;以及信号包络的提取方法。 一、信号包络 直观地从时域来讲&#xff0c;信号包络就是信号波形的轮廓。 本质上&#xff0c;信号包络是带通信号的基带部分。 一个实带通信号记为x(t)&#xff0c;将它频谱的中心频点搬移到零频…

Win,M1Mac上安装jupyter的MATLAB支持插件的方法

tags: MATLAB Win Mac Tips 写在前面 11月的最后一天了, 总结一下支持MATLAB的一个jupyter的插件, 有了这个你就可以在jupyter notebook或者jupyter lab上面使用MATLAB语句了, 还是很不错的, 虽然我安装了好久… 下面来说一下我在我的电脑以及朋友的电脑(Win11)上面安装这个…

实例方法(instance method)、类方法、构造方法(三)

实例方法&#xff08;没有static&#xff09;的概念 对象被称为实例。实例相关的有&#xff1a;实例变量、实例方法。实例变量是对象变量。实例方法是对象方法。实例方法没有static。&#xff08;对象方法&#xff0c;对象级别的方法&#xff09; 实例方法的调用需要先new一个…

高维多元时序数据聚类

1. 简介 收集数据的能力不断增强&#xff0c;使我们有可能收集大量的异构数据。在可用的异构数据中&#xff0c;时间序列代表着尚未被充分探索的信息母体。当前的数据挖掘技术在分析时间序列时存在多个缺点&#xff0c;尤其是在应同时分析多个时间序列&#xff08;即多维时间序…

JVM运行时数据 堆

JVM运行时数据 堆快速调试堆参数设置堆分类运行流程Minor GC、Major GC与Full GC分代思想内存分配策略TLAB堆空间参数设置快速调试 一个JVM实例只存在一个堆内存&#xff0c;对也是Java内存管理的核心区域Java 堆区在Jvm启动的时候创建&#xff0c;其空间大小也就确定了。是JV…

[附源码]计算机毕业设计springboot课室预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

NVIDIA 7th SkyHackathon(八)使用 Flask 与 Vue 开发 Web

1.页面效果 Web 采用 flaskvue 开发&#xff0c;效果图如下 2.后端 import sys import subprocess import os from PIL import Image from datetime import datetime from ASR_metrics import utils as metricsfrom werkzeug.wrappers import Request, Response from …

分层架构理论基础

一、三层架构 1、什么是三层架构 三层架构&#xff08;3-tier architecture&#xff09;通常意义上的三层架构就是将整个业务应用划分为&#xff1a;表示层&#xff08;User Interface layer&#xff09;、业务逻辑层&#xff08;Business Logic Layer&#xff09;、数据访问层…

数仓之hive自定义UDTF函数详解

学习目录一、自定义UDTF函数一、自定义UDTF函数 1.说明文档 A custom UDTF can be created by extending the GenericUDTF abstract class and then implementing the initialize, process, and possibly close methods. The initialize method is called by Hive to notify t…

本机使用python操作hdfs搭建及常见问题

一.虚拟机安装CentOS7并配置共享文件夹 二.CentOS 7 上hadoop伪分布式搭建全流程完整教程 三.本机使用python操作hdfs搭建及常见问题 四.mapreduce搭建 五.mapper-reducer编程搭建 本机使用python操作hdfs搭建及常见问题一、环境搭建1.打开虚拟机系统&#xff0c;打开hadoop2.修…

高效率开发Web安全扫描器之路(一)

一、背景 经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞&#xff0c;一直好奇它们怎么能挖到这么多漏洞&#xff0c;开始还以为它们不上班除了睡觉就挖漏洞&#xff0c;后来有机会认识了一些大佬&#xff0c;发现它们大部分漏洞其实是通过工具挖掘的&#xff0c;比如说下…

安卓版微信8.0.31内测版出炉:安装包变小,功能变多!

人是社会性生物&#xff0c;建立依恋、经营亲密关系是人的本能&#xff0c;只不过到了网络时代之后&#xff0c;用户进行交流的方式几乎都变成了微信等社交软件。 不仅可以让用户很便捷的和朋友进行沟通&#xff0c;并且在上班办公的时候&#xff0c;也是可以轻松传输文件等&a…

MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

一、准备工作 首先需要准备好环境&#xff0c;包含必要的软件&#xff0c;痞子衡的环境如下&#xff1a; 集成开发环境&#xff1a; MCUXpresso IDE_11.6.0_8187&#xff0c;点此下载软件开发包&#xff1a; SDK_2.12.1_EVK-MIMXRT1170&#xff08;Toolchain需包含MCUXpresso I…

Compose学习-> Text()

设置文本&#xff1a;text xxx 直接设置 Text(text "我是一个Text")引用资源文件&#xff1a;stringResource Text(text stringResource(id R.string.string_text))设置字体颜色&#xff1a;color xxx 引用系统自带的颜色 Text(text "我是一个Text"…

【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计(原理图+仿真+源代码+实物图+答辩论文+答辩PPT)

typora-root-url: ./ 【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计&#xff08;原理图仿真源代码实物图答辩论文答辩PPT&#xff09; 文章目录typora-root-url: ./【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计&#xff08;原理图仿真源代码实…

C++习题2

指针调用数组元素 指针调用数组元素 int a[3][4] {{1,4,7,10},{2,5,8,11},{3,6,9,12}};int* pa[3] { a[0],a[1],a[2] };int(*pb)[4]; pb a;int** q pa;cout << *(a[2] 3)<<endl;cout << *(*(pa 2) 3)<<endl;cout << pb[2][3]<<en…

【JavaWeb】Filter

文章目录1.Filter过滤器2.Filter的初体验3.Filter的生命周期4.FilterConfig类5.FilterChain过滤器链6.Filter的拦截路径1.Filter过滤器 (1).概念及作用 Filter过滤器是JavaWeb的三大组件之一三大组件分别是:Servlet程序,Listener监听器,Filter过滤器Filter过滤器是JavaEE的规…

MBA管理类联考英语二题型答题时间及次序问题

还有不到一个月时间&#xff0c;2023年MBA联考也进入到最后的收官阶段&#xff0c;这个阶段对于多数已经系统复习过的考生&#xff0c;一般需要进行通盘梳理备考&#xff0c;而不是专注于单个模块的复习。在做试卷或真题的过程中&#xff0c;如何才能更有利于分数这个问题需要大…

闲人闲谈PS之三十五——物资备货与提前采购

惯例闲话&#xff1a;又一年快过去了&#xff0c;回想刚刚开始在CSDN上写笔记&#xff0c;还是2年前的事情。闲人其实是一个拖延症十分严重的人&#xff0c;自从开始走上写作这条路之后&#xff0c;治疗拖延症找到了办法&#xff0c;每天总有一些事情让闲人去思考&#xff0c;然…

Miniconda:在pycharm的terminal中无法使用Conda命令

在pycharm的terminal中无法使用Conda命令 问题&#xff1a; 在本地下载好conda系列后&#xff0c;在pycharm的terminal中无法使用conda命令 问题分析&#xff1a; 说的很清楚了&#xff0c;是因为当前支持的shells没有初始化conda 所以我们只需要把Shell 路径改成激活cond…