线程实现方式

adb详细教程(四)-使用adb启动应用、关闭应用、清空应用数据、获取设备已安装应用列表 adb对于安卓移动端来说,是个非常重要的调试工具。通过ADB可以操作、管理设备上的应用。 阅读详情

集成Thread类

public class Thread01 extends Thread{

    @Override
    public void run(){
        System.out.println("我是子线程");
        System.out.println("子线程 = "+Thread.currentThread().getName());
    }

    public static void main(String[] args){
        System.out.println("main = "+Thread.currentThread().getName());
        //
    }
}

实现Runnable接口

public class TheadTest02 implements Runnable{

        System.out.println("main = "+Thread.currentThread().getName());
        new Thread(new ThreadTest02(),"test-01").start();
    }

    @Override
    public void run(){
        System.out.println("子线程 = "+Thread.currentThread().getName());
    }
}

使用lambda表达式

public class TheadTest02 implements Runnable{

    public static void main(String[] args){
        System.out.println("main = "+Thread.currentThread().getName());
        new Thread(()->{
            System.out.println("子线程 = "+Thread.currentThread().getName());
        });
    }
}

使用Callable,FutureTask实现

此种方式能获取到线程的返回结果。

使用线程池创建线程

public class ThreadTest03{

    public static void main(String[] args){

        System.out.println("main = "+Thread.currentThread().getName());
        ExecutorService exP = Executors.newFixedThreadPool(2);/*可变定长线程池*/
        ExecutorService exS = Executors.newCachedThreadPool();
        exS.execute(new Runnable(){
            @Override
            public void run(){
                System.out.println("子线程 "+Thread.currentThread().getName());
            }
        });
    }

}

使用Spring的注解方式@Sync

自定义异步注解实现方法

Aop拦截只要在我们的方法上有使用到@WindakaAsync就单独的开启一个异步线程执行我们的目标方法。

Aop环绕通知@Around会拦截目标方法

线程安全性问题

    多个线程同时对一个全局变量做写的操作,可能会受到其它线程的干扰,就会发生线程安全问题。

public class ThreadCount implements Runnable{

    private int count = 100;
    
    @Override
    public void run(){
        count--;
        System.out.println("-->count = "+count+" , “+Thread.currentThread().getName());
    }
}

public class Thread03 {

    public static void main(String[] args){
        ThreadCount thC = new ThreadCount();
        
        new Thread(thC).start();
        new Thread(thC).start();
    }

}

如何解决线程多线程线程安全问题?也就是如何实现线程同步?

    核心思想:上锁

    可能会发生线程安全性问题的代码需要上锁。

public class ThreadCount implements Runnable{

    private int count = 100;
    
    @Override
    public void run(){
        /*此处需上锁*/
        synchronized(this){
            count--;
        }
        /*此处需解锁*/
        System.out.println("-->count = "+count+" , “+Thread.currentThread().getName());
    }
}

Synchronized锁的基本用法

修饰代码块

修饰实例方法

      如果Synchronized加到实例方法上,则使用this锁。

      如果Synchronized加到静态方法上,则使用 synchronized(当前的类名.class){  xx }

修饰静态方法

synchronized死锁诊断工具

        jconsole.exe

Sping bean对象是单例模式

@Scope(value = "prototype")       /*如果把bean对象设置成原型,bean对象就变成多例模式*/

public class CountService{

}

wait(),notify()使用

public class ThreadTest{

    class Res{
        public String userName;
        public String sex;
        public boolean flag = false;
    }

    class InPutThread extend Thread{
        public Res res;
        public InPutThread(Res res){
            this.res = res;
        }

        @Override
        public void run(){
            int count = 0;
            while(true){
                synchronized(res){
                    if(res.flag == true){
                        res.wait();
                    }
                    if(count == 0){
                        res.userName = "小强";
                        res.sex = "男";
                    }else{
                        res.userName = "小花";
                        res.sex = "女";
                    }
                    res.flag = true;
                    res.notify();
                }
            }
        }
    }

    class OutPutThread extends Thread{
        private Res res;

        public OutPutThread(Res res){
            this.res = res;
        }

        @Override
        public void run(){
            while(true){
                synchronized(res){
                    if(res.flag == flase){
                        res.wait();
                    }
                    System.out.println(res.userName+" , "+res.sex);
                    res.flag = flase;
                    res.notify();
                }
            }
        }
    }

    public static void main(String[] args){
        new ThreadTest().print();
    }

    public void print(){
        Res res = new Res();
        InPutThread in = new InPutThread(res);
        OutPutThread out = new OutPutThread(res);

        in.start();
        out.start();
    }
}

Lock锁

Synchronized不需要手动释放锁,lock锁需要进行手动释放锁。因此必须xx.lock()和xx.unlock()配对使用。

LogManager练习

@Component
public class LogManager{

    private BlockingQueue<String> bQ = new LinkedBlockingDeque<>();
    
    public LogManager(){
        LogThread lT = new LogThread();
        lT.start();
    }

    public void info(String log){
        bQ.offer(log);
    }

    class LogThread extends Thread{
        @Override
        public void run(){
            while(true){
                String log = bQ.poll();
                if(log != null){
                    System.out.println(log);
                }
            }
        }
    }
}

Homebrew国内镜像自动安装全攻略:从零到精通 本文提供了一份详尽的Homebrew国内镜像自动安装指南,旨在帮助Mac用户,特别是国内开发者,快速、无痛地部署这一强大的包管理器。通过使用优化的国内镜像脚本,实现一键自动安装,有效解决官方源访问缓慢或失败的问题。文章从安装前准备、脚本执行步骤、原理讲解到日常使用命令和常见问题排查,提供了从零到精通的完整路径,让用户在短时间内掌握Homebrew的核心用法,提升开发与工作效率。 阅读详情

相关推荐

计算机视觉与深度学习实战:以Python为工具,基于帧间差法进行视频目标检测

计算机视觉是一门研究如何使机器从数字图像或视频中提取、分析和理解有用信息的学科。它涉及图像处理、计算机图形学、人工智能等多个领域的知识。通过计算机视觉技术,我们可以实现图像的识别、分类、目标检测等功能。本文介绍了计算机视觉与深度学习的基本概念和原理,并以Python为工具,基于帧间差分法实现了视频目标检测。帧间差分法具有算法实现简单、程序设计复杂度低、对光线等场景变化不太敏感等优点,因此在实际应用中得到了广泛的应用。然而,帧间差分法也存在一些局限性,如对于缓慢移动或静止的物体检测效果不佳。

一个好知识的传播者 1256

re之flag切片查找

【代码】re之flag切片查找。

2302_79135465的博客 261

欧姆龙 CJ1W-SCU模块使用通配符+结束码实现非固定长度数据的接收

实验设备:CJ2M-CPU33、CJ1W-SCU21、XW2Z-200T 实验目的:了解 CJ1W-SCU 通配符使用 1.硬件接线: CJ1W-SCU21单元号拨码置于8,使用串口1(232口)。 2.软件设置: ① 新建工程,选择PLC型号CJ2M-CPU33,切换到编程模式,如下图: 、 ② 创建I/O并进行相关配置,如下图: ③ 设置为用户设置,协议宏模式,8位数据位,2位停止位,偶校验9600波特率,如下图: 、 ④ 打开CX-Protocal软件,新建工程: .

weixin_42118352的博客 1986

多线程知识(三) 多线程通讯

多线程之间实现通讯 目标 多线程之间如何通讯 wait、notify、notifyAll()方法 lock 停止线程 守护线程 Join方法 优先级 Yield 多线程之间如何实现通讯 2.1 什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 2.2 多线程之间通讯需求 需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作。 2.3代码实现基本实现 2.3.1共享资源源实体类...

liuerchong的博客 237

高速PCB设计中的信号完整性挑战:回损、插损与串扰的深度解析

本文深入探讨了高速PCB设计中的信号完整性挑战,重点分析了回损、插损与串扰三大关键问题。通过实际案例和专业技术解析,提供了降低回损的阻抗控制技巧、减少插损的板材选择建议以及抑制串扰的布线策略,帮助工程师应对5G和AI芯片时代的高速信号传输需求。

websocket5live的博客 265

lammps建模(电解液)opls-aa力场的基本流程

lammps建模(电解液)opls-aa力场的基本流程

syj0922的博客 2134

线程之间的通讯

一、经典问题:生产者与消费者 1.1 共享资源 class Res{ public String name; public String sex; } 1.2 生产者 class InThread extends Thread { private Res res; public InThread(Res res) { this.res = res; } ...

lyj2018gyq的博客 266

让 ABAP 开发更聪明的搭档:SAP Joule for Developers 与 ABAP AI Capabilities 全面实战

摘要:SAP已将生成式AI集成到ABAP开发工具中,推出Joule for Developers功能。该功能直接嵌入Eclipse开发环境,提供代码解释、生成、测试构造和遗留代码迁移等辅助功能。Joule支持ABAP Cloud项目开发,能围绕当前开发对象提供上下文相关的建议,帮助开发者高效完成应用开发与迁移任务。启用该功能需升级ADT并获取相应许可,典型应用场景包括RAP应用构建和S/4HANA迁移中的代码重构。官方资源提供了多个实践案例,帮助开发者快速上手这一AI辅助开发功能。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 495

四、java多线程基础之线程之间的通信

一、什么是多线程之间的通讯 1.概念:多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 二、多线程通讯模拟出现的问题 1.需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作。 2.代码 // 共享对象 class Res { // 姓名 public String name; // 性别 ...

码农小默 309

BioEmu 扩散模型加速传统分子动力学(MD)模拟

BioEmu 是一种创新的生成式深度学习系统,通过高效采样和准确预测蛋白质的动态机制,为蛋白质科学和药物设计提供了新的工具。它在多构象采样、MD 模拟拟合和蛋白质稳定性预测方面表现出色,同时显著降低了计算成本。BioEmu 的开发为未来蛋白质动态研究和应用奠定了坚实基础。

weixin_42357472的博客 320

新手友好!C#上位机调用YOLO实现设备异常检测(详细步骤,附踩坑指南)

C#上位机调用YOLO实现设备异常检测,核心是把“工控交互”和“AI检测”的优势结合起来,新手不用追求一步到位,先跑通基础流程,再逐步优化性能和功能。我当初也是从踩坑中过来的,只要把核心链路和细节摸透,其实门槛并没有想象中高。如果你们在实操中遇到了具体问题(比如相机取流卡顿、模型推理报错),可以在评论区留言,后续我也可以针对性拆解具体模块的完整代码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 669

规范的前台JS操作返回

$.post('@Url.Action("BatchCancel")', postData, function (res) { if (res.flag) { ZTLayer.showTips('@T("admin.order.cancelorder.ok")', 6, 3000, function () { window.location.reload(); ...

oopts的博客 387

Qualcomm Camera 启动优化实战:Preview、Snapshot、ZSL 路径控制与时延剖析

在移动终端上,Camera 的“启动速度”与“抓拍响应”是决定用户体验的关键指标。以 Qualcomm Snapdragon 平台为代表,Camera Stack 涉及 HAL 初始化、Session 配置、ISP 路径激活、Buffer 分配、图像流启动等多个异步流程,稍有设计不当将导致 Preview 启动缓慢或抓拍延迟明显。本文基于高通平台架构与 CamX 实战经验,详细剖析 Preview 与 Snapshot 启动路径,重点分析 ZSL 模式下的全链路优化策略,给出具体时延测量方法与调试参数建议。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1585

线程的实现方式总结

线程的实现方式共有四种,第一种是继承Thread抽象类;第二种是实现Runnable接口;第三种是实现Callable接口;最后一种是通过线程池创建线程。写一个类去继承Thread类,重写其中的run()方法,然后调用start()方法启动线程。写一个类去实现Runnable接口,重写其中的run()方法;用用实现Runnable接口的对象作为参数实例化一个Thread对象,调用Thread类的start()方法来启动线程。实现Runnable接口比继承Thread类所具有的优势:1. 适合多个相同的程序代

blanceage的博客 6653

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

多线程的几种实现方式

上篇文章总结了下关于线程池很干,很干的干货,这次想着顺便连其他实现多线程的三种方式也汇总下吧! java多线程的几种实现方式: 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3.通过Callable和FutureTask创建线程 4.通过线程池创建线程 (上一篇已经讲过了...

Mr.zhao 7万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

线程介绍及 Java 实现线程的三种方式

线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和资源,但每个线程拥有独立的执行栈和程序计数器。线程是实现并发编程的重要工具,能够提高程序的执行效率和响应性。然而,多线程编程也带来了复杂性和调试困难。通过合理地使用线程同步机制,可以避免竞态条件和死锁等问题。在 Java 中,实现线程主要有三种方式:继承Thread类、实现Runnable接口和使用Callable和Future。

秃头之旅 678

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

线程的3种实现方式

线程的3种实现方式 在引入线程的操作系统中,进程是资源分配的基本单位,线程是独立调度的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。 线程分为两种: 名称 描述 用户级线程(User-Level Thread, ULT) 由应用程序所支持的线程实现, 对内核不可见 ...

Mr.Phoebe的专栏 1万+

线程的四种实现方式

1.继承Thread类 一个类继承Thread类,重写run()方法,调用Thread类中的start()方法启动线程。 2.实现Runnable类 自定义类实现Runnable接口,重写run()方法;用实现Runnable接口的对象作为参数实例化一个Thread对象,调用Thread类的start()方法来启动线程 实现Runnable接口比继承Thread类所具有的优势: 1. 适合多个相同的程序代码的线程去共享同一个资源。 2. 可以避免java中的单继承的局限性。 3...

weixin_46217160的博客 9768

线程的实现方式

线程池是用来维护和控制线程的,给他一个线程任务,他会分配一个空闲线程用来处理线程任务,执行结束后该线程会处于空闲状态,等待执行下一个线程任务。创建该类的实例并且将其作为FutureTask类的构造方法的参数,创建Thread实例并将FutureTask作为构造方法的参数,执行start()方法启动线程,可以通过get()方法获取执行结果。用Executors工具类创建一个ExecutorService类型的线程池对象,可通过该对象的execute()方法向线程池提交一个线程对象。

2301_77661292的博客 595

线程以及的线程实现方式

操作系统—线程 1、什么是线程 - 有部分进程需要同时做很多事,引入线程来增加并发度 - 线程是程序执行流的最小单位,进程之间可以并发执行,进程内部的各个线程也可以并发的执行。 - 引入线程之后,进程就只作为除cpu之外的系统资源的分配单元(打印机) 2、线程机制带来的变化(对比传统的) - 进程变成资源分配的基本单位,线程是调度的基本单位 ,线程之间可以实现并发。 - 提高了并发度 线程的切换不需要切换进程环境,系统开销减小 3、线程的属性: - 线程不拥有系统的资源,共享的是进程的系统

qq_43243907的博客 179

线程的三种实现方式

最近有看到Java线程的实现相关问题,在此对线程实现方式做一个小小的总结,当做笔记,便于日后查看。 平时常用的线程方式有三种: (1)、继承Thread类,并重写其run()方法。 (2)、实现Runnable接口,并实现其run()方法。 (3)、实现Callable接口,并实现其call()方法。 下面对三种实现方法进行一个简单的讲解: 1、继承Thread public cl...

qq_33304273的博客 5219

线程两种的实现方式

线程实现的两种方式 继承的方式 package org.shareing.mythread; /** * 继承方式实现线程 */ public class Test001 extends Thread{ public void run(){ System.out.println("进入 run 方法了。。。"); } public static...

shareing 334

线程的两种实现方式

线程有两种实现方式 通过继承Thread类实现一个线程 通过实现Runnable接口实现一个线程 第一种方式拓展性不强,因为如果一个类继承了thread之后,就不能再继承其他的类了 线程的启动方式 Thread thread = new Thread(继承了thread的对象/实现了Runnable的对象); //在创建线程完成后,都需要设置名称,可以用于区分线程 thread.setName("设置一个线程名称"); thread.start(); 线程启动使用的是start方法,而启动了

黄文孝同学的博客 898

线程的四种实现方式,一些方法及线程的同步

Java多线程实现的方式有四种 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3.通过Callable和FutureTask创建线程 4.通过线程池创建线程 前面两种可以归结为一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有...

weixin_30865427的博客 157

创建线程(实现线程)的方式

创建线程的方式只有一种,创建一个Thread对象;实现线程执行逻辑的方式有四种。

2301_78423465的博客 1094

线程的俩种实现方式

线程 俩种实现方式: 1.继承Thread类,重写run方法 public class DownLoad extends Thread{ private String name; public DownLoad(String name) { this.name = name; } @Override public void run() { ...

qq_41935885的博客 122
上一篇: CountDownLatch讲解
下一篇: mysql知识点
ware_soft
博客等级 码龄17年 75粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

ware_soft

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

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

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

打赏作者

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

抵扣说明:

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

余额充值