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

FPGA开发者必看:Xilinx PCIe IP核BAR地址配置避坑指南(附实例解析) 本文为FPGA开发者提供了Xilinx PCIe IP核中BAR地址配置的详细避坑指南。文章深入解析了32位与64位地址空间的选择逻辑、Pcie to AXI Translation参数的核心作用,并通过实例说明如何正确配置以避免地址映射错乱和数据访问失败。重点探讨了BAR空间类型、大小设定以及地址转换机制,帮助开发者构建清晰可靠的PCIe系统,是调试与优化PCIe设计的关键参考。 阅读详情

这估计是我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发的出来不 发不出来就在知乎发好了

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

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32) 阅读详情

相关推荐

保姆级教程:从零到飞,用QGC地面站搞定PX4无人机全流程配置(含避坑指南)

本文提供了一份详细的QGC地面站使用教程,指导用户从零开始配置PX4无人机,涵盖固件烧录、传感器校准、遥控器设置及航点规划等关键步骤,并包含实用的避坑指南,帮助新手顺利完成首飞。

weixin_30329623的博客 219

Java中的耦合和解耦

耦合 百度百科: 耦合也叫块间联系,指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块之间越独立则越差。 Java中耦合: 例如在web开发中,表现层需要持有业务层的对象,业务层中需要持有持久层的对象,这种关系是很强的依赖关系。 代码如下: 业务层:(在包service下) package top.radish.service public class AccountService { // 持久层的AccountDao对象 private AccountD

Radish 2871

避坑指南:QT Creator报Unknown module(s) in QT: serialport的5种解决方法

本文详细解析了Qt Creator报'Unknown module(s) in QT: serialport'错误的5种解决方法,包括检查Qt版本兼容性、安装缺失组件、配置Kit环境等。针对Windows和Linux平台提供具体操作步骤,帮助开发者快速解决串口通信模块问题,提升开发效率。

weixin_29197051的博客 156

java多态如何实现解耦_如何基于Spring使用工厂模式实现程序解耦

这篇文章主要介绍了如何基于Spring使用工厂模式实现程序解耦,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1、 啥是耦合、解耦?既然是程序解耦,那我们必须要先知道啥是耦合,耦合简单来说就是程序的依赖关系,而依赖关系则主要包括1、 类之间的依赖2、 方法间的依赖比如下面这段代码:public class A{public int i;}publi...

weixin_36248959的博客 577

hive sql每个用户的累积访问次数

我们有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/1/20 3 u01 2017/1/23 6 u01 2017/2/21 8 U02 2017/1/23 6 U01 2017/2/22 4 要求使用SQL...

weixin_39150719的博客 3480

基于ROS的机械臂手眼标定-Aruco使用与相机标定

基于ROS的机械臂手眼标定-Aruco使用与相机标定 折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。 程序都是Copy的开源代码,所以也开源出来: 开源地址:https://gitee.com/ohhuo/handeye-calib 作为手眼标定中的重要一环,相机中标定板位姿关系获取直接影响标定精度,我们使用aruco这个开源程序来实现坐标的获取。 #mermaid-svg-WkFpFkV4QqzXMvJ4 .labe

生活不止眼前的苟且 1万+

Java springboot主线程拆分多子线程任务,完成后继续主线程

开发中遇到了一个问题,我们数据库里的数据是加密过的,读取、计算等等操作,都会有对原始数据进行加解密的操作。 问题是单次操作数据量有几千条,如果是单线程进行解密的话,时间实在是有点慢。这是不能忍受的,所以,我们需要对其进行并发加解密。 我的具体思路是这样的,因为加解密的动作,其实是对一个长List进行单项的加解密的动作。 可以将这个长List进行分段区分,生成多个子线程的任务,每个子线程只执行长List中的一段区间内的加解密,多个子线程都完...

rgbhi的博客 2603

FreeModbus源码详解

本篇按照FreeModbus协议栈的工作流程,对源代码进行总结解析;FreeModbus协议栈作为从机,等待主机传送的数据,当从机接收到一帧完整的报文后,对报文进行解析,然后响应主机,发送报文给主机,实现主机和从机之间的通信; 1:demo.c中三个函数,完成协议栈的准备工作; eMBInit()函数:(mb.c) /*函数功能: *1:实现RTU模式和ASCALL模式的协议栈初始化; *2

2万+

Java 多线程

Java多线程的相关笔记

weixin_51679737的博客 177

腾讯ACE反作弊系统:内核驱动与AI行为分析如何守护游戏公平

在游戏安全领域,反作弊技术是保障公平竞技环境的核心防线。其基本原理是通过监控系统关键行为,识别并阻断非法的第三方程序干预。从技术实现看,现代反作弊方案普遍采用分层防御架构,结合用户态模块进行应用层检测,并依赖内核态驱动实现底层深度监控,以此构建纵深防御体系。这种技术的核心价值在于,它能有效对抗从简单内存修改到高级驱动级作弊等多种威胁,维护游戏经济系统和玩家体验的完整性。随着作弊手段的演进,行为分析与AI赋能变得至关重要,系统通过机器学习模型分析进程行为序列的异常模式,即使面对未知特征的外挂变种也能进行有效识

weixin_33978578的博客 741

【1.2】Costas环的基本原理概述

Costas环是一种用于载波恢复的相干解调技术,可直接从BPSK等抑制载波信号中恢复本地载波并完成解调。其核心结构包含同相/正交双支路处理,通过混频、低通滤波后,利用I/Q支路信号乘积进行相位误差检测,经环路滤波器调节VCO输出频率,实现载波同步。课程将重点讲解Costas环的MATLAB仿真实现、系统性能分析及FPGA开发,包括信号产生、频偏模拟、滤波器设计等模块,并通过AWGN信道和不同频偏条件下的测试验证系统性能。该技术无需单独提取载波,在数字通信系统中具有重要应用价值。

fpga/matlab/simulink算法仿真工程 450

Java线程之间的通信

通信方式一: volatile 变量的写 - 读 这一点是利用了 volatile 写 和 读之间规则,也就是:volatile变量写完以后,会将写好的变量值立刻刷新到主存里面, volatile变量被读之前,会先从主存中里面读取这个 volatile变量的值,说到底,volatile变量 就是借助于规则和主存这两个必要条件来进行线程间的通信。如果 volatile 变量 和 其他变量...

Otar 312

一文读懂 CST 时/频域求解器

本文系统介绍了CST Studio Suite中的关键网格技术——六面体网格、四面体网格以及TLM求解器专用的八叉树非均匀网格技术。重点阐述了六面体网格的三项核心技术:理想边界拟合(PBA)技术可精确处理曲面边界,薄片技术(TST)能高效模拟薄层结构,自适应八叉树网格实现计算资源最优分配。同时详细对比了六面体网格与四面体网格的特点及适用场景,前者适用于系统级EMC/EMI分析等时域问题,后者擅长处理复杂曲面和异质材料的频域问题。

一只豌豆象的博客 462

Java 模块解耦的设计策略

我们学习了如何实现两种模式来解耦 Java 模块。这两种方法都使消费者模块依赖于抽象,这始终是软件组件设计中所需的功能。当然,每一种都有其优点和缺点。对于第一个,我们得到了很好的解耦,但我们必须创建一个额外的工厂类。对于第二个,为了使模块解耦,我们必须创建一个额外的抽象模块并使用 Service Loader API 添加新的间接级别。

江帅帅 541

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深入浅出Java并发多线程(2)- 实现线程方式

1 实现多线程的方法有几种 2种 public class RunnableStyle implements Runnable { public static void main(String[] args) { Thread thread = new Thread(new RunnableStyle()); thread.start(); } @Override public void run() { System

一角残叶的博客 547

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java 高级应用-多线程-(一)实现 Runnable 接口与继承 Thread 类

Java 高级应用-多线程-实现 Runnable 接口与继承 Thread 类

weixin_45817985的博客 3450

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java线程完全解耦和弱耦合

完全解耦: public class Application{     public static void main(String Args[]){         House house=new House();         house.setWater(10);         Thread dog,cat;         dog=new Thread(house);        ...

qq1922631820的博客 1412

【Java】线程学习笔记

活点地图1. 相关概念1.1 进程1.2 线程1.3 多进程2.Java中的线程2.1 主线程 main线程2.2 线程的状态与生命周期1)新建2)运行3)中断4)死亡3. 线程优先级4.Thread类与线程的创建 1. 相关概念 1.1 进程 程序是一段静态的代码,是应用软件执行的蓝本。 进程是程序的一次动态执行过程,经历了从代码加载、执行、到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展甚至消亡的过程。 1.2 线程 进程和线程都是实现并发的一个基本单位。线程不是进程,是比进程更小的执行单位

嗨!这里是水母 435

java基础——详解多线程机制

今天是大年初四,新年里我感触最深的一天,刚刚写完一篇关于java网络编程基础的文章。我就马不停蹄的开始复习之前学习过的多线程。 上午的时候,一个偶然的机会点开了知乎,搜索了关于编程大婶们文章,看着他们的心路历程,充满着挑战,让我充满了羡慕之情呀!无形中也给我增加了不少压力,我也可以成长为那样的大神吗? 我想对自己说可以的。 多线程机制 目录 java中的线程 Thread类和线程...

super_优快云er的博客 857

【了解Java多线程】三种方式实现多线程

①辨析线程与进程的基本概念,了解多线程的定义及运行机制;②在java中通过继承Thread类、实现Runnable类、实现Callable类三种方式,实现多线程的创建,得到同一示例的三种编程方式,便于对比学习......

m0_46427461的博客 402

多线程售票解耦写法(使用传统synchronized 关键字)

解耦前: 类SaleTicket与Runnable永远捆绑在了一起,它会变成一个线程类,而不是一个纯粹的类,不能很好体现OOP思想。 package com.han.demo01; public class TestComparedSaleTicket { public static void main(String[] args) { SaleTicket st = new SaleTicket(); new Thread(st, "窗口1").start();

qq_42732184的博客 337

QThread之重写run() 实现线程与业务解耦

一、线程的一般实现形式 Qt中线程类QThread有2种使用方式。 1.继承自QThread,重写run() class MyThread : public QThread { Q_OBJECT protected: virtual void run() override { ... } }; 我们一般在run()中加个死循环,不停处理业务或者调用相关的方法。这样的话,我们的业务逻辑与线程紧密耦合在一起。 适用场景: 用于一直不停处理业务,而不是处理完一单业务后,就可以休眠的这

百里杨的博客 2193

内存数据库SQLite

本文以“黑板”比喻内存数据库,对比传统硬盘数据库,详解 SQLite 使用 :memory: 实现高速临时存储的原理与优势。通过动态占位符生成、executemany 批量操作等技巧,实现毫秒级数据读写,适用于单元测试、临时计算与隐私保护场景。强调其瞬时性与内存限制,提醒开发者注意数据量控制与安全防护,突出参数化查询防注入的核心价值。

看了都说刑的博客 316

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 149

深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析

本文深入解析JVM垃圾回收机制,涵盖GC核心概念、垃圾判定(基于可达性分析)、四大回收算法(标记清除、复制、标记整理、分代回收)及其应用场景。重点说明GC主要作用于堆内存,通过根对象遍历识别不可达对象,避免循环引用问题;并结合新生代与老年代特性,阐述分代回收如何提升效率,实现高效内存管理。

qq_61228769的博客 646

11-01-演进-.NET GC发展史

.NET GC发展史映射硬件演进:从单核STW到多核并发,再到区域化细粒度回收。历经分代管理、ServerGC、BackgroundGC、LOH自动压缩、POH隔离、DATC自适应线程数及Region-based管理等关键革新,代码量从5000行增至4万+,复杂度指数上升。每一步优化均在暂停时间、吞吐量与资源开销间权衡,体现“实用主义”哲学。核心启示:GC演进由硬件驱动,方向明确——更短暂停、更高效率,但代价是工程复杂性持续攀升。

设计 AI 玩游戏🎮 344
上一篇: JAVA系列 IO流 知识结构整理 建立合理的知识框架逻辑 输入输出流 理顺你的思维架构Fileoutput inputStream FileWriter FIleReader结构整理
下一篇: 经济学文章---巨量人口对政经的加速减速效应、
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨骅麟(Morgan Young)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值