JAVA系列 多线程 Thread类 耦合 线程调度 如何创建线程 弱耦合 完全解耦 思维结构整理

news2024/11/19 7:35:04

这估计是我JAVA系列 基础知识点梳理的最后一篇文章了吧

之后一段时间 我打算去看看之前承诺更新的JAVA的一些项目了 然后我要好好玩一段时间游戏 然后跟某些好朋友见面 所以后面会忙一点

然后就是很多同学 六级还没有考 估计很多人是开学再考把 这个假期就不要玩的太厉害了 没事就看看我之前写的关于CET6 整理的文章

CET6 历年真题原词复现 核心词汇 做题技巧 听力拿分技巧汇总(这篇文章是英语四六级考试最后的版本,谢谢大家一路陪伴)

话不多说 进入正题

本章我觉得也没什么好讲的 因为书上都很详细了,我主要的目的还是要给大家梳理思路

最重要的有些内容呢 我提下 主要的提的还是基础部分 方便唤醒各位的回忆。

还是那句话 重要的内容不要妄想通过网上的碎片化知识就觉得自己学懂了 学明白了 一定要回归教材 看看书上的内容和介绍。

线程的核心 run方法和start方法的区别 如何启动一个线程

一个线程的start方法 就是调用了Thread类中的run方法,但start调用和run调用不一样。

如果仅仅使用run方法来调用 那仍然只有一个单线程

只有使用了start方法 才又进行了一个线程 虽然start方法也是执行的run方法的内容

start方法包含了run方法 为什么这么描述 因为start执行内容和你重写的run内容是一样的。但是却多出来了一个新的线程。

核心问题 如何创建线程Thread类

也就是如何创建一个线程?

有两种比较常见的方法。

第一种 使用Thread类子类 这类方法常见的结构核心就是extends Thread。

//speakelephant类 第一种创建方法 使用Thred子类创建线程
public class speakelephant extends Thread{
public void run(){
   for(int i=0;i<20;i++)
    System.out.print(i);
 }
}

main主函数

public class Example{
public static void main(String args[]){
speakelephant test1=new speakelephant();
test1.start();
}
}

第二种就是使用Thread类 这类常见特征就是implements Runnable接口

//由于这里是使用的接口 所以我们还可以extends一个父类 更加灵活
//for example 
//public class ElephantTarget extends xxx implements Runnable  
public class ElephantTarget implements Runnable{
public void run(){
 for(int i=0;i<20;i++)
 System.out.print(i);
}
}

main主函数

    import java.util.*;
    public class Main {
        public static void main(String[] args)  {
            Thread number1=new Thread(new ElephantTarget());//使用内部类创建 先不着急 熟悉了再用
           
            ElephantTarget a=new ElephantTarget();
            Thread number2=new Thread(a);//标准创建操作  有两步 先创建一个实现了Runnable接口的类
                                //然后再用这个类创建一个Thread类 最后实现功能的是Thread类 number2

            number1.start();
            number2.start();
        }
    }

主要就是上面两种方便大家记忆。

线程调度和优先级

每个JAVA线程的优先级都在常数1和10之间,即

Thread.MIN_PRIORITY和Thread.MAX_PRIORITY之间。如果没有明确地设置线程地优先级别,每个线程地优先级都为常熟5 即Thread.NORM_PRIORITY

线程优先级可以通过setPriority(int grade)方法调整 有些操作系统只识别3个级别 1 5 10

然后接下来要讲一下

耦合的概念

public class House implements Runnable{
    public void run(){
            String name=Thread.currentThread().getName();//线性编程
            if(name.equals("Dog")){
                System.out.println(name+" is drinking water");
                System.out.println("现在是house类中的run方法中的if分支Dog在运行");
            }
            else if(name.equals("Cat")){
                System.out.println(name+" is drinking water");
                System.out.println("现在是house类中的run方法中的if分支Cat在运行");
            }
    }
}
    import java.util.*;
    import java.io.*;
    public class Main {
        public static void main(String[] args)  {
            House a=new House();


            Thread dog=new Thread(a);//他们都是用house类创建的Thread类
            Thread cat=new Thread(a);//他们都是用house类创建的Thread类
            //但是为什么可以这样 首先house类实现了Runnable接口 所以依旧可以创建 这里二者还没开始分家


            dog.setName("Dog");
            cat.setName("Cat");//这一步 线程拥有了自己的名字 我们再去看我们的house类代码
//你会发现 由于house类中有分支结构 分别给了cat和dog不同的if路径 所以在设置完线程名称后 二者开始分家了
                                
            dog.start();


            System.out.println("-------------------------------------");
//这一步很明显我想把二者打印的东西分开来 
//但是大家看我的输出结果出现了问题 
//没如我所愿 这是一个意外 因为主线程跑的比dog线程更快
// 因为dog线程还包含了启动时间 这个时候主线程已经运行到这里了



            cat.start();
                
        }
    }

运行结果:

上面展示的是

完全解耦

也就是目标对象与线程的完全解耦

书上是这样写的:“创建目标对象的House类并没有组合cat和dog线程对象,也就是说House创建的目标对象不包含cat和dog线程对象的引用(完全解耦),在这种情况下,目标对象经常需要获得线程的名字(因为无法获得线程对象的引用)

String name =Thread.currentThread().getName();

以便确定是哪个线程正在占用CPU资源。

那书上这一段话是什么意思呢 我看了半天都没有看懂。

思考了一番过后 我来谈谈我的理解

完全解耦的意思是 我的实现Runnable接口的那个类

也就是创建Thread类时 经常使用的 代码 Thread a=new Thread(xxxx)

这个xxx就是我们说的实现Runnable接口的类 然后我们这个类如果自身不包含Thread类成员

并且命名线程名字的时候都是在main函数 就像这样(刚才那部分代码也有)

  import java.util.*;
    import java.io.*;
    public class Main {
        public static void main(String[] args)  {
            House a=new House();


            Thread dog=new Thread(a);//他们都是用house类创建的Thread类
            Thread cat=new Thread(a);//他们都是用house类创建的Thread类
            //但是为什么可以这样 首先house类实现了Runnable接口 所以依旧可以创建 这里二者还没开始分家


            dog.setName("Dog");
            cat.setName("Cat");

而不是在类里面直接创建一个cat 或者dog的Thread类(这句话可能有点抽象 我现在给你展示)

弱耦合

import java.util.Currency;

public class House implements Runnable{

   Thread dog;
   Thread cat;
   House(){//构造函数
       dog=new Thread(this);//用this作为target来构建 说明dog和cat同时拥有相同的public run方法
       cat=new Thread(this);//用this作为target来构建 说明dog和cat同时拥有相同的public run方法
   }


    public void run(){
          while(true){
              Thread t= Thread.currentThread();
              if(t==dog){//t==dog是用地址来判断 不是线程的名字来判断的
                  System.out.println("现在是dog线程");
              }
              else if(t==cat){
                  System.out.println("现在是cat线程");
              }
          }
    }
}
public class Main {
    public static void main(String argu[]){
    House a=new House();
    a.cat.start();
    a.dog.start();
    }
}

上面的这两段代码就是弱耦合

按照书上的原话来说:”目标对象可以组合线程,将线程作为自己的成员(弱耦合),比如让线程cat和dog在House中。当创建目标对象的类组合线程对象时,目标对象可以通过获得线程对象的引用:

Thread.currentThread();

来确定哪个线程正在占用CPU资源,即被JVM正在执行。“

换句话说 也就是cat和dog这样的Thread类、

就在House这个类里面作为成员存在。

并且他们拥有相同的House类的run方法 因为你看上面的代码 他们就是用House来构建的Thread类

dog=new Thread(this);
cat=new Thread(this);

其他

书后面还有什么

线程的常用方法啊

线程同步机制的一些内容

就请同学们自己去看看书啦 那么今天的内容就到这里结束了 这篇文章也是花了我不少时间呢

方便的话麻烦点个赞捏 谢谢各位

最近想出一片关于经济的文章 不知道csdn发的出来不 发不出来就在知乎发好了

估计会耗时若干天 尽请期待

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

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

相关文章

人员超员识别系统 yolov5

人员超员识别系统通过yolov5深度学习网络模型对现场画面进行实时监测&#xff0c;监测到画面中区域人数超过规定人数时&#xff0c;立即抓拍存档预警。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类与目标定位的回归问题结合起来&#xff…

一篇彻底解决:Fatal error compiling: 无效的目标发行版: 11 -> [Help 1]

先在这声明,如果我的方法没有解决你的问题,那你直接私信我,我第一时间帮你解决,送佛送到西!!! 这个问题&#xff0c;主要原因就是JDK的版本问题&#xff0c;“无效的目标发行版&#xff1a;11”的意思是你在某个位置配置了JDK11&#xff0c;但是在其他位置配置的并不是11&…

靶机测试Gears of War笔记

靶机介绍Its a CTF machine that deals with the history of gears of war, where we must try to escape from prison and obtain root privileges. it has some rabbit holes, so you have to try to connect the tracks to get access.This works better with VirtualBox ra…

[ 数据结构 ] 二叉树详解--------前序、中序、后序、存储、线索化

0 前言 why?为什么需要树结构? 数组虽然查找快(通过下标访问),但无法动态扩容(拷贝到新的数组),而链表相反,树结构刚好结合两者优点 浅谈树? 树的存储和读取效率都很高,比如二叉排序树,理解树的抽象模型有助于理解递归的原理,树的模型接近于单向链表,父节点指向左右子树,而…

【因果发现】 针对时序数据的因果图学习

文章目录 一、任务二、数据集说明三、专业名词CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、任务 This track focuses on solving a causal structure learning problem in AIOps. AIOps 相关:主要目标是从事件序列数据中挖掘因果图关系,并辅助定位根因。 主要需要解…

php学习笔记-php数组的创建和使用,数组常用函数-day03

php数组的创建和使用&#xff0c;数组常用函数数组的概念一维数组的创建和使用1.直接将变量声明为数组元素2.通过array()函数来创建一维数组3.数组的元素值的访问4.数组元素的赋值方式5.数组的注意事项二维数组的创建和使用1.二维数组的创建2.二维数组的数组元素值访问3.二维元…

ArcGIS基础实验操作100例--实验67设置标注样式

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验67 设置标注样式 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

Java+Swing可视化图像处理软件

JavaSwing可视化图像处理软件一、系统介绍二、功能展示1.图片裁剪2.图片缩放3.图片旋转4.图像灰度处理5.图像变形6.图像扭曲7.图像移动三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统&#xff1f;四、其它1.其他系统实现2.获取源码一、系统介绍 该系统实…

Allegro174版本新功能介绍之和172版本兼容设置

Allegro174版本新功能介绍之和172版本兼容设置 Allegro升级到了174版本的时候,如果按照常规操作用174版本保存PCB之后,用172版本是无法打开的。 但是174版本开放了一个和172版本兼容的窗口,即便是174版本保存了PCB,172同样还是能够打开 具体操作如下 选择Setup选择User p…

[Linux]git命令行

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

前端入门笔记 05 —— js基础

基于ES6 生成html文件&#xff0c;script标签引入js文件 简单语句直接用console面板 <!DOCTYPE html> <html><head><title>js核心语法</title><meta charset"UTF-8" /></head><body><script src "./1.5j…

多线程(4)

文章目录1.单例模式2. 阻塞队列3. 定时器4.线程池前言 :   前面的一些文章&#xff0c;我们已经将有关多线的基础知识了解了&#xff0c; 下面我们来写一些关于多线程的代码案例&#xff0c;来强化对多线程的理解&#xff0c;另外通过这些案例补充一下其他方面的知识。 1.单例…

印度如何在云计算中抓住千载难逢的机会

云对印度的影响大流行和后大流行时期的虚拟和混合世界越来越依赖于云&#xff0c;并随之提高灵活性、敏捷性和创新性。在这场快速的数字化转型中&#xff0c;印度企业也纷纷加入云解决方案以促进业务增长。NASSCOM-EY的调查显示&#xff0c;78%的印度IT公司、53%的医疗保健和BF…

【Javascript】数字和字符串常用方法

数字常用方法&#xff1a; toFixed&#xff1a;保留小数位数&#xff0c;不够自动补0. 注意&#xff1a;返回值是字符串&#xff0c;不能和数字直接相加减&#xff0c;需要把字符串转化为数字&#xff1a;-0即可 取整&#xff1a; // round:四舍五入取整console.log(Math.roun…

SQL IN 操作符

IN 操作符 IN 操作符允许您在 WHERE 子句中规定多个值。 SQL IN 语法 SELECT column1, column2, ... FROM table_name WHERE column IN (value1, value2, ...); 参数说明&#xff1a; column1, column2, ...&#xff1a;要选择的字段名称&#xff0c;可以为多个字段。如果…

STM32——USART串口

文章目录一、通信接口二、串口通信三、硬件电路四、电平标准五、串口参数及时序六、STM32的USART外设简介七、USART框图八、USART基本结构九、数据帧十、起始位侦测和采样位置对齐十一、数据采样十二、波特率发生器十三、数据模式十四、串口发送电路设计关键代码USART_SendData…

基于Java+Swing+mysql眼镜店管理系统

基于JavaSwingmysql眼镜店管理系统一、系统介绍二、功能展示1.管理员登陆2.眼镜信息查询3.眼镜信息添加4.眼镜信息修改5.眼镜信息删除三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统&#xff1f;四、其它1.其他系统实现2.获取源码一、系统介绍 该系统实…

Linux常用命令——find命令

在线Linux命令查询工具 find 在指定目录下查找文件 补充说明 find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时&#xff0c;不设置任何参数&#xff0c;则find命令将在当前目录下查找子目录与文件。并且将查找到的子…

js设计模式(二)-创建型模式

创建型设计模式介绍 在软件工程中&#xff0c;创建型模式是处理对象创建的设计模式&#xff0c;试图根据实际情况使用合适的方式创建对象。基本的对象创建方式可能会导致设计上的问题&#xff0c;或增加设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。 创…

GCN-LSTM 预测出租车速度 英文 Taxi Speed Prediction Using GCN-LSTM

GCN-LSTM模型预测出租车速度 GCN&#xff1a;又称GNN&#xff0c;图神经网络 LSTM&#xff1a;长短时记忆网络 可做学习参考 Summary One of the most valuable findings in engineering is the determination of taxi speed. Since the GCN-LSTM program software can r…