4、并发基础

正交试验实战指南:从PICT工具到混合水平表应用 本文详细介绍了正交试验法在测试设计中的实战应用,从基础概念到PICT工具的高级使用技巧。通过混合水平表设计和工程化实践案例,帮助测试工程师高效解决参数组合爆炸问题,提升测试覆盖率与效率。特别适合兼容性测试和复杂系统验证场景。 阅读详情

用JMX来查看Java程序包含哪些线程:

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

public class MultiThread{
    public static void main(String[] args) {
        // 获取Java线程管理MXBean
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        // 不需要获取同步的monitor和synchronizer信息,仅获取线程和线程堆栈信息
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        // 遍历线程信息,仅打印线程ID和线程名称信息
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.
            getThreadName());
        }
    }
}

析:看看有哪些线程

运行结果:
[5] Attach Listener
[4] Signal Dispatcher  // 分发处理发送给JVM信号的线程
[3] Finalizer       // 调用对象finalize方法的线程
[2] Reference Handler   // 清除Reference的线程
[1] main           // main线程,用户程序入口

java线程状态

这里写图片描述

Daemon线程

Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持性工作。这意味着,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出。可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程。

Daemon线程被用作完成支持性工作,但是在Java虚拟机退出时Daemon线程中的finally块并不一定会执行,示例如代码

public class Daemon {
    public static void main(String[] args) {
        Thread thread = new Thread(new DaemonRunner(), "DaemonRunner");
        //  把线程设置成Daemon线程
        thread.setDaemon(true);
        thread.start();
}
    static class DaemonRunner implements Runnable {
        @Override
        public void run() {
            try {
                SleepUtils.second(1);
            } finally {
                System.out.println("DaemonThread finally run.");
            }
        }
    }
}

注:如果把线程设置成Daemon线程,最后执行结果不会输出任何东西,因为:
main线程(非Daemon线程)在启动了线程DaemonRunner之后随着main方法执行完毕而终止,而此时Java虚拟机中已经没有非Daemon线程,虚拟机需要退出。Java虚拟机中的所有Daemon线程都需要立即终止,因此DaemonRunner立即终止,但是DaemonRunner中的finally块并没有执行。

如果去掉  thread.setDaemon(true);
会输出 DaemonThread finally run.

中断

Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。这好比是家里的父母叮嘱在外的子女要注意身体,但子女是否注意身体,怎么注意身体则完全取决于自己。

Java中断模型也是这么简单,每个线程对象里都有一个boolean类型的标识(不一定就要是Thread类的字段,实际上也的确不是,这几个方法最终都是通过native方法来完成的),代表着是否有中断请求(该请求可以来自所有线程,包括被中断的线程本身)。例如,当线程t1想中断线程t2,只需要在线程t1中将线程t2对象的中断标识置为true,然后线程2可以选择在合适的时候处理该中断请求,甚至可以不理会该请求,就像这个线程没有被中断一样。

java.lang.Thread类提供了几个方法来操作这个中断状态,这些方法包括:
这里写图片描述
注意:interrupted方法的意思是先返回是否中断的布尔值,之后将中断标识置为FALSE。

上面的例子中,线程t1通过调用interrupt方法将线程t2的中断状态置为true,t2可以在合适的时候调用interrupted或isInterrupted来检测状态并做相应的处理。

中断的使用:
通常,中断的使用场景有以下几个:
点击某个桌面应用中的取消按钮时;
某个操作超过了一定的执行时间限制需要中止时;
多个线程做相同的事情,只要一个线程成功其它线程都可以取消时;
一组线程中的一个或多个出现错误导致整组都无法继续时;
当一个应用或服务需要停止时。

package bingfa;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;

public class FileScanner {
    private static void listFile(File f) throws InterruptedException {
        if(f == null) {
            throw new IllegalArgumentException();
        }
        if(f.isFile()) {
            System.out.println(f);
            return;
        }
        File[] allFiles = f.listFiles();
        // 此处的线程是指当前线程自己
        if(Thread.interrupted()) {
            throw new InterruptedException("文件扫描任务被中断");
        }
        for(File file : allFiles) {
            //还可以将中断检测放到这里
            listFile(file);
        }
    }
    // 从控制台读取
    public static String readFromConsole() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            return reader.readLine();
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    public static void main(String[] args) throws Exception {
        // 线程1,这个线程就是扫描文件夹的
        final Thread fileIteratorThread = new Thread() {
            public void run() {
                try {
                    listFile(new File("c:\\"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        // 线程2用来中断线程1
        new Thread() {
            public void run() {
                while(true) {
                    if("quit".equalsIgnoreCase(readFromConsole())) {
                        if(fileIteratorThread.isAlive()) {
                            fileIteratorThread.interrupt();
                            return;
                        }
                    } else {
                        System.out.println("输入quit退出文件扫描");
                    }
                }
            }
        }.start();
        fileIteratorThread.start();
    }
}

终止线程:
中断适合用来取消或停止任务。
除了中断以外,还可以利用一个boolean变量来控制是否需要停止任务并终止该线程。

import java.util.concurrent.TimeUnit;

public class Shutdown {
    public static void main(String[] args) throws Exception {
        Runner one = new Runner();
        Thread countThread = new Thread(one, "CountThread");
        countThread.start();
        // 睡眠1秒,main线程对CountThread进行中断,使CountThread能够感知中断而结束
        TimeUnit.SECONDS.sleep(1);
        // 中断
        countThread.interrupt();
        Runner two = new Runner();
        countThread = new Thread(two, "CountThread");
        countThread.start();
        // 睡眠1秒,main线程对Runner two进行取消,使CountThread能够感知on为false而结束
        TimeUnit.SECONDS.sleep(1);
        two.cancel();
    }


    private static class Runner implements Runnable {
        private long i;
        private volatile boolean on = true;
        @Override
        public void run() {
            while (on && !Thread.currentThread().isInterrupted()){
                i++;
            }
            System.out.println("Count i = " + i);
        }
        public void cancel() {
            on = false;
        }
    }
}
11、CUDA 内存优化:平铺矩阵乘法技术解析 本文深入解析了CUDA中的平铺矩阵乘法技术,重点介绍了如何利用共享内存和线程协作减少全局内存访问,提升计算效率。通过矩阵乘法实例,详细阐述了平铺算法的执行流程、内核代码实现及性能优化策略,包括平铺大小选择、线程同步机制和代码优化建议。文章还分析了该技术在深度学习、图像处理和科学计算等领域的应用价值,为CUDA程序的内存优化提供了系统性指导。 阅读详情

相关推荐

最新版MySQL 9.0 数据库的下载与安装(图文)

本篇文章基于Windows 10 系统下载与安装MySQL 9.0 版本。

我是聂可的博客 7万+

4-5 多线程

多线程 多线程技术概述 进程与线程 进程 是指一个内存中运行的应用程序,每个进程都用独立的内存空间 线程 是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个线程 线程是在进程的基础上进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干线程 线程调度 分时调度 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。 抢占式调度 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性), Ja

weixin_43072239的博客 358

电磁流量计模拟前端电路设计与优化

模拟前端电路(AFE)是传感器信号处理的核心环节,通过放大、滤波和模数转换实现信号调理。其设计需重点考虑放大器共模抑制比(CMRR)和ADC分辨率等关键参数,在电磁流量计等工业测量应用中,AD8220仪表放大器与AD7172-2 Σ-Δ型ADC的组合能有效简化传统多级架构。现代过采样技术结合数字滤波可替代模拟滤波器,显著提升系统集成度与测量精度,这种设计方法同样适用于压力传感、生物电信号采集等需要高精度信号调理的场景。

weixin_42602241的博客 616

过渡到 3CX 4并发基础版

3CX提供从托管迁移到自托管的选择,用户可将4并发专业版降级为免费基础版。基础版适合个人和小团队,包含核心通信功能但不支持3CX托管服务和IP话机。迁移需自行部署系统,可选择本地或私有云方案。用户可随时切换,3CX提供分步迁移指南协助过渡。无论选择哪个版本,目标都是确保团队通信顺畅。

电话交换机IPPBX软件3CX是一个完整的通信平台,为客户提供简单、灵活且经济实惠的通话、视频和在线聊天解决方案。 548

AgentScope实战指南:从源码解析到Qwen模型的多Agent协作开发

本文提供了AgentScope多智能体开发框架的实战指南,详细解析了其核心架构与工作原理,并展示了如何利用Qwen模型构建从单智能体对话到多智能体协作的完整应用。通过两个具体代码实例,指导开发者快速上手环境配置、模型接入与智能体编排,实现高效的多Agent系统开发。

ff678的博客 640

继电保护整定值计算软件_「全套69份」整定值计算与设计方案

【全套69份】整定值计算与设计方案,输电线路、变压器、发电机、电容器、母线保护等下载方式见文末内容预览:10kV高压电机保护原理及整定计算35kV环网运行线路继电保护整定计算方案分析35KV以下继电保护及三段式电流保护整定计算110 kv电网计算机整定计算新方案220kV两相式电铁牵引站供电线路的短路故障计算及其保护整定原则分析220kV周潮线接地距离保护整定计算特殊方案750 kV变压器保护配置...

weixin_30825953的博客 5013

4、Java 并发编程基础

4、Java 并发编程基础4.1 线程简介什么是线程为什么要使用多线程线程优先级线程的状态Daemon线程4.2 启动和终止线程构造线程启动线程理解中断过期的suspend()、resume()和stop()安全地终止线程4.3 线程间通信volatile和synchronized关键字等待/通知机制等待/通知的经典范式管道输入/输出流Thread.join()的使用ThreadLocal的使用4.4 线程应用实例等待超时模式连接池线程池技术及其示例 线程作为操作系统调度的最小单元,多个线程能够同时执行,这

北笙LBJ的博客 201

KEPServerEX 6 之 GE Ethernet 连接FANUC ROBOT机器人实战

GE Fanuc是GE公司控制系统部门的一部分,成立于1998年。其主要业务涵盖工业自动化、控制系统、PLC和组态软件等领域。其产品可用于包括自动化、过程自动化、国防、汽车制造、通讯、医疗和航空航天等各种工业领域2009 8月 GE和FANUC今天宣布两家公司已同意解除合资企业GE FANUC自动化公司。通过以上历史,GE Ethernet Driver 当下还支持对接FANUC ROBOT机器人 就不奇怪了。

-雲飛兄-博客 1790

并发基础4(JUC)

1:什么事JUC 2: 3: 4:

huyiju的博客 404

Vue3 - 详解实现网站接入钉钉扫码登录功能,钉钉授权生成登录二维码用户用手机扫描二维码登陆,支持弹框式、浏览器单独新开页显示,钉钉扫描二维码登录详细流程及示例代码,最新vue集成钉钉扫码授权登录!

vue3,nuxt3,钉钉,扫码登录,vue3钉钉扫码登陆,钉钉授权第三方WEB网站扫码登录功能,钉钉扫码登录第三方网站,单点登录,二维码不显示,报错,扫了没反应,出错,vue3钉钉扫码登录,内嵌,获取个人信息,pc网页钉钉登录,钉钉扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描钉钉二维码登录网站,页面弹出一个小窗口而不是打开一个页面,vue3中使用iframe实现另开小窗口扫码登

🏆 前端领域优质创作者 3694

手把手教你学Simulink——基于Simulink的机械臂正运动学仿真建模示例

机械臂正运动学概述正运动学的核心在于根据每个关节的角度值,通过坐标变换(如DH参数法或齐次变换矩阵)计算出末端执行器相对于基座的位置和姿态。常用的数学工具包括旋转矩阵、平移向量以及它们组合而成的齐次变换矩阵。仿真目标设计并实现一个机械臂正运动学模型。输入关节角度,输出末端执行器的位置和姿态。分析不同关节角度下的机械臂位置变化。假设我们有一个简单的3自由度(DOF)平面机械臂,其各关节的长度分别为l1l1​、l2l2​和l3l3​。在Simulink中,可以使用。

MHD0815的博客 359

并发编程4:Java 中的并发基础构建模块

委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。Java 平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类(Synchronizer)等。Java 并发类的 API 文档,。

swadian2008的博客 296

C++经典面试题100例及答案

答:把一些具有共性的对象归类后形成一个集合,也就是所谓的类。答:这样可以提高编译效率,因为分开的话只需要编译一次生成对应的.obj文件后,再次应用该类的地方,这个类就不会被再次编译,从而大大的提高了编译效率。答:这种函数会自动为内联函数,这种函数在函数调用的地方在编译阶段都会进行代码替换。答:常对象是指在任何场合都不能对其成员的值进行修改的对象。答:所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。

usstmiracle的博客 3万+

第4章 Java并发编程基础

第4章 Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process) 在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量 处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行 4.1.2 为什么要使用多线程 更多的处理器核心 线程是大多数操作系统调度的基本单元,一个程序作为一个进程来运行,程序运行过程中能够创建多个线程,而一个线程在一个时刻只

小Cesar的博客 133

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

精雕软件(JDpaint) 5.5 绿色版

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

第4章 并发断言:基础(序列,属性,断言)

这些是时域断言,允许使用基于时钟(采样)边缘的语义创建复杂序列。这与完全组合逻辑的立即断言相反,并且不允许时域序列。  并发断言是SVA语言的要旨。它们被称为并发,因为它们与其余的设计逻辑并行执行。让我们从基础开始,继续讨论并发断言的复杂概念。  让我们先学习并发断言的基本语法,然后研究它的语义。                                                 图4...

XtremeDV 9195

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

4.Java 并发基础相关面试

什么是线程和进程? 进程是什么? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。 如下图所示,在 windows 中通过查看任务管理器的方式,我们就可以清楚看到 window 当前运行的进程(.exe 文件的运行)。 线程是什么? 线程与进程相似,但线程是一个比进程更小的执行单位。

weixin_43681813的博客 134

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JAVA并发之多线程基础(4)

继上篇文章JAVA并发之多线程基础(3)谈到的信号量以及读写锁之外,接下来就继续谈及JDK中并发类的操作。 CountDownLatch 倒计时器是在某一些程序需要前置处理的时候完美搭档。例如我们经常玩的手游端,在游戏开始之前,它会去调用其他的组件,例如画面环境、人物图像、武器装备等,等加载完成之后再进入到主界面中进行游戏。 countDown()方法是每个线程完成之后减1,代表一个线...

weixin_33915554的博客 109

Java并发编程艺术 4 Java并发编程基础

第四章 Java并发编程基础 优先级 操作系统使用时分的形式调度运行的线程。每个线程会被分配到若干时间片,当线程时间片用户线程发生调度,执行下一个线程。当前线程等待下次分配。 通过成员变量priority设置优先级。范围1-10。默认5。数值越大优先级越高,10最高。 线程的状态 Java线程可能处于一下6中状态,在给定的某一时刻只能处于一种状态。

mdq11111的博客 315

Python并发之协程基础(4)

1, 基本概念 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程 我觉得单说协程,比较抽象,如果对线程有一定了解的话,应该就比较好理解了。 那么这么来理解协程比较容易:   线程是系统级别的,它们是由操作系统调度;协程是程序级别的,由程序员根据需要自己调度。我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行...

布鲁斯 707

Phi-4-mini-reasoning基础教程:Gradio队列机制与并发请求限流

本文介绍了如何在星图GPU平台上自动化部署Phi-4-mini-reasoning 3.8B 参数轻量级开源模型,并利用Gradio队列机制实现高效推理任务管理。该模型专为数学推理和逻辑推导设计,适用于教育解题助手、代码分析等强逻辑场景,通过配置并发限流策略可确保服务稳定性与资源公平分配。

weixin_36311421的博客 689

《Java并发编程的艺术》学习之路-- $4 Java并发编程基础

《Java并发编程的艺术》 学习之路 第四章 Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 操作系统调度的最小单元是线程,也叫轻量级进程(LightWeight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。 4.1.2 为什么要使用多线程 (1)更多的处理器核心 (2)更快的响应时间 (3)更好...

jiangyunfan16的博客 208

4、并发编程基础-同步类容器和并发类容器

1、同步类容器 同步类容器都是线程安全的,但是在某些场景下可能需要加锁来保护复合操作。复合操作如:迭代(反复访问元素,变量容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationException,原因就是当容器迭代的过程中,被并发的修改了内容,这是由于...

青学博客 400

【Java并发编程 基础】4.线程状态

线程分为了六种状态,如下:初始状态(NEW):线程被构建,但是还没有调用start状态运行状态(RUNNABLE):就绪和运行笼统称为运行中等待状态分三种阻塞状态(BLOCKED):等待调用synchronized 等待状态(WAITING):调用了wait方法 超时等待(TIME_WAITING):不同于等待,是到达一定的时间自动进入运行状态(Thread.sleep)终止状态(TERMINATED): 表示当前线程执行完毕1.1、join(合并线程,等待该线程终止) 在没调用join之前,线程跑的是不规

terrybg 1万+

数据库基础4—事务管理,并发处理

数据并发的问题      一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库。数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会 导致各种并发问题,破坏数据的完整性。 这些问题可以归结为5类,包括3类数据读问题(脏读、幻象读和不可重复读)以及2类数据更新问题(第一类丢失更新和 第二类丢失更新)。下面,我们分别通过实例讲解引发问题的场景。 脏读(d

xietingcandice的专栏 760

java -进阶之路_java 基础篇(4)_并发

系列博客 <<java - 进阶之路>> 总览 目录 一.Java并发结构 线程 构造方法 启动线程 优先级 控制方法 静态方法 线程组 同步 对象与锁 同步方法和同步块 等待锁与释放锁 静态变量/方法 监视器 二.Java高并发解决方案 1、同步和异步的区别和联系 2、如何处理并发和同步 3、常见并发同步案例分析 ...

初级小白_的博客 794

第4章 Java并发编程基础(基础笔记篇,包含代码案例)

4.1 线程简介 4.2 启动和终止线程 4.3 线程间通信 4.4 线程应用实例

m0_64421869的博客 1160
上一篇: 3、Java内存模型
下一篇: java.util.Arrays类
李家少年
博客等级 码龄14年 20粉丝 202原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值