Java多线程礼让yeild()和插队join()方法案例

article/2025/9/6 19:23:16

 一.   yeild()和join()方法


        1.yeild():线程礼让,让当前正在执行的线程可能暂停,但不阻塞
        2.yeild():当前正在执行的线程可能暂停,也可能不暂停。
        3.yeild():是静态方法,而join()是非静态方法
        4.join():能起到线程插队的作用。

案例一:使用yeild(),线程有时礼让,有时不礼让 。

public class TestDemo07 implements Runnable {public static void main(String[] args) {// TODO Auto-generated method stubTestDemo07 t1=new TestDemo07();TestDemo07 t2=new TestDemo07();new Thread(t1,"线程A").start();new Thread(t1,"线程B").start();new Thread(t1,"线程C").start();}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println(Thread.currentThread().getName()+" 线程正在开始执行");Thread.yield();System.out.println(Thread.currentThread().getName()+" 线程停止执行");}
}

运行结果:

 

案例二:join()能起到线程插队的作用

package com.zc;public class TestDemo08 implements Runnable {public static void main(String[] args) {//启动我们的线程TestDemo08 t1=new TestDemo08();Thread thread = new Thread(t1,"线程A");thread.start();//主线程for(int i = 0; i < 100; i++) {System.out.println("main"+i);if(i==30) {try{//新增的子线程插队thread.join();} catch(InterruptedException e){e.printStackTrace();}System.out.println("main"+i);}}}@Overridepublic void run() {try {//线程休息3秒,插队的线程就会整整齐齐的显示出来Thread.sleep(3000);} catch (InterruptedException e) {System.out.println("线程休眠失败");e.printStackTrace();}for(int i = 0; i <50; i++) {System.out.println("插队的线程正在赶来" +i);}}
}

       线程安全问题
         .现象:多条线程消费(读取,更改)一些已经被消费过的数据。(消费:更改,更新)。
         .原因:
             1.每一个子线程都有自己的工作空间。
             2.破坏了数据的原子性(不可分割)。(同时成功或者同时失败)
             3.多条线程(并发)操作同一共享数据。
             4.几乎无法预测线程的执行顺序。(每个子线程工作过程不透明)
             5.只存在读数据的时候,不会产生线程安全问题。

二.    synchronized关键字和volatile关键字

          ●synchronized 属于一 种重量级锁,也是一种悲观锁。
         ●synchronized 可以在任意对象及方法上加锁,也可以存在synchronized代码块。而加锁的这段代码称为"互斥区 "或"临界区"

          ●synchronized所修饰的代码范围越少,往往性能就会越好。
         ●synchronized 采用的是monitor对象监视器(底层实现)
         ●synchronized 保证原子性操作,许多源码也有用到它{只要保证原子性,线程就是安全的。}
         ●synchronized 有颗粒性(粒度性),synchronized块能控制互斥区的范围。
         

注意:线程安全越高,往往性能越低。

案例一 :synchronized关键字使用

public class TestDemo05 implements Runnable {private int ticketNum = 100;//加synchronized块的run方法区就是互斥区的范围@Overridepublic synchronized void run() {// 获取当前时间long time1 = System.currentTimeMillis();// 具体的卖票逻辑while (ticketNum > 0) {// currentThread():返回对当前正在执行的线程对象的引用。System.out.println(Thread.currentThread().getName() + "拿到了第"+ ticketNum-- + "票");}long time2 = System.currentTimeMillis();System.out.println("本次程序运行时间为: " + (time2 - time1));}public static void main(String[] args) {//synchronized 有颗粒性,所以只创建一个对象即可。TestDemo05 t1 = new TestDemo05();//TestDemo05 t2 = new TestDemo05();//TestDemo05 t3 = new TestDemo05();new Thread(t1, "张三").start();new Thread(t1, "李四").start();new Thread(t1, "王五").start();}}

运行结果:张三拿到了100张票。李四,王五都没打印。

 三.synchronized锁的是什么东西?(颗粒性/粒度性)

        1. 如果在非静态方法中使用synchronized,锁住的是当前的调用对象。public synchronized                 void    methodA(){}
        2 .如果在静态方法中使用synchronized,锁住的是当前的调用类。public synchronized static                 void methodA(){}
        3 .synchronized(this),锁住的是当前代码块的调用者。(当前方法的调用者)
        4 .synchronized("string"),锁住的是对应的变量。

        5.synchronized存在对象锁和非对象锁,同一对象锁之间存在互斥,其他类似的锁也是同理。
        

public class TestDemo06 extends Thread{//A方法是在方法上加synchronized//打印一句话并且休眠3S  public synchronized void methodA(){System.out.println("methodA......");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}}//B方法锁的是当前对象的代码块//这里的this指的是TestDemo06的实例化对象public void methodB(){synchronized (this) {System.out.println(Thread.currentThread().getName()+"methodB......");}}//C方法锁的是一个简单的字符串//打印一句话public void methodC(){String str="hello";synchronized (str) {System.out.println("methodC......");}}public static void main(String[] args){final TestDemo06 t6=new TestDemo06();//final TestDemo06 t7=new TestDemo06();//第一个线程Thread t1=new Thread(new Runnable() {@Overridepublic void run() {t6.methodA();}});t1.start();//第二个线程Thread t2=new Thread(new Runnable() {@Overridepublic void run() {t6.methodB();}},"线程t2");t2.start();//第三个线程Thread t3=new Thread(new Runnable() {@Overridepublic void run() {t6.methodC();}});t3.start();//第四个线程/*Thread t4=new Thread(new Runnable() {@Overridepublic void run() {t7.methodB();}},"线程t4");t4.start();*/}
}

运行结果1:

 运行结果2:去掉对象final TestDemo06 t7=new TestDemo06();和第四个线程的注释

 分析图:

 

四.volatile变量使用案例

        ●volatile 变量可以被看作是一种  "轻量的synchronized"
         ●volatile 关键字的主要作用是使变量在多个线程间可见,也就是满足线程安全的                  可见性。
         ●volatile 用来及时刷新线程中的变量值
         ●volatile 不保证原子性操作。子线程A在执行操作时,会先去主线程空间去刷取到最新的值,然后再做自己的操作。

public class TestDemo08 implements Runnable {private volatile int ticketNum = 100;@Overridepublic  void run() {//获取当前时间long time1=System.currentTimeMillis();//具体的卖票逻辑while(ticketNum > 0) {//currentThread():返回对当前正在执行的线程对象的引用。System.out.println(Thread.currentThread().getName()+ "拿到了第" + ticketNum-- +"票");}long time2=System.currentTimeMillis();System.out.println("本次程序运行时间为: "+ (time2-time1));}public static void main(String[] args) {TestDemo08 t1 = new TestDemo08();//张三李四王五,不会拿到序号相同的票数。new Thread(t1,"张三").start();new Thread(t1,"李四").start();new Thread(t1,"王五").start();	}}

运行结果:volatile不能完全保证线程安全性。但是对于本次例子是可以保证线程安全的。


http://chatgpt.dhexx.cn/article/CmuZBkiu.shtml

相关文章

gitlab artifacts too large

gitlab在打包artifacts遇到&#xff1a; Uploading artifacts as “archive” to coordinator… too large archive 413 error 网上看了很多方案&#xff0c;一般都是说在admin账户的setting下找到CI/CD&#xff0c;把Maximum artifacts size (MB)改大点 当然这是其中一个点哈…

IDEA 解决 artifacts not found 问题

目录 1. 问题2. 解答方法一方法二 1. 问题 部署 Tomcat 时&#xff0c;选择 Edit Configuration 无 Artifact 选项。 2. 解答 方法一 选择 Fix 直接修复即可。 方法二 打开 Project Structure&#xff1b;选择 Aritfacts 选项&#xff1b;点击 号&#xff0c;选择 Web …

jenkins使用Send build artifacts over SSH遇到的坑

在jenkins构建项目后&#xff0c;优势需要把jar等文件复制到其他服务器&#xff0c;如下图&#xff0c;可以使用Send build artifacts over SSH功能。 但是在使用时可能会遇到无法复制成功 可以从以下几方面入手&#xff0c;基本可以解决该问题 1、检查是否配好了目标主机的用…

【论文笔记】Details or Artifacts: A Locally Discriminative Learning Approach toRealistic Image Super-Reso

细节还是伪纹理&#xff1a;真实图像超分辨率的局部判别方法 来自于CVPR2022&#xff0c;作者Jie Liang&#xff0c; Hui Zeng and Lei Zhang 论文地址&#xff1a;https://arxiv.org/abs/2203.09195 Abstract: 目前超分想要优异的纹理信息&#xff0c;那GAN&#xff08;生成…

解析IDEA中的Artifacts配置

1. Artifact 2. Artifact名称 3. Artifact类型 4. 输出路径&#xff08;也就是Deployment root部署根目录&#xff09;&#xff0c;项目运行后的输出根目录 5. 输出根目录&#xff0c;即4指定的地址 6. 输出目录下的结构层次 针对指定项目&#xff0c;对应分析 1. 输出根…

idea配置Tomcat时没有Artifacts选项

想要解决没有artifacts选项的问题&#xff0c;首先要配置项目结构。 点击加号&#xff0c;选择web 然后修改地址,编译后的文件将会生成在你修改的文件夹下&#xff0c;点击Apply应用所作的修改&#xff0c;然后点击Create Artifacts 此时idea就会在Artifacts下生成一个Web expl…

idea为web项目添加tomcat并配置Artifacts

背景 有一天聪明的小峰从网上找了一个web项目&#xff0c;但是只有代码没有启动步骤&#xff0c;作为小白的我解决这个问题也不太顺利特此记录一下。 主要解决的问题&#xff1a; 为项目添加tomact 配置Artifacts 引入 jar包 小峰找的项目地址&#xff1a;https://github.com/…

idea配置factets和Artifacts

最近需要把项目部署到服务器&#xff0c;需要打个war包&#xff0c;有好多不太明白&#xff0c;把搜索学习到的知识点汇总一下&#xff0c;以备后用&#xff0c;本人使用的版本是2020.3版本。 在说明这个配置过程之前&#xff0c;先简单的介绍一下这两个是什么&#xff0c;有什…

IDEA中WEB项目结构和Artifacts设置

公司的WEB项目结构一直比较随意&#xff0c;没有统一的规范&#xff0c;新增项目也是直接用旧的项目文件夹拷贝过去修改&#xff0c;时间长了以后项目文件结构混乱&#xff0c;研究了半天终于找到了&#xff08;可能&#xff09;正确的目录结构设置&#xff0c;能够直接输出正确…

棋盘效应(Checkerboard Artifacts)

定义&#xff1a;棋盘效应是由于反卷积的“不均匀重叠”&#xff08;Uneven overlap&#xff09;的结果。使图像中某个部位的颜色比其他部位更深&#xff1a; 具体原因&#xff1a;在反卷积操作时&#xff0c;如果卷积核&#xff08;Kernel&#xff09;大小不能被步长&#xff…

Idea 精准到类的打包方式:Artifacts 打包

这种打包方式更精确&#xff0c;可以直接精确到具体类&#xff0c;这种情况下打的包&#xff0c;上传到 Flink web 时&#xff0c;不需要手动写入 class 文件名&#xff0c;它会自动填入&#xff0c;如果没有自动填入&#xff0c;或许是你的 Flink 版本太低了&#xff0c;我的是…

Idea 2022 创建 Artifacts 运行 Tomcat 步骤

每次一个新 web 项目都被 idea 搞的晕头转向。只要是 xml 文件无法发布&#xff0c;初步判断这是 idea 的一个 bug&#xff0c;现整理如下。 首先确保 Project Structure 下 Modules 的配置正确。 Project Structure / Artifacts / 中使用 号菜单进入如下图界面。 从 Modules …

Bug:No artifacts configured

可能是因为项目是直接git下来的&#xff0c;所以项目的框架不完整&#xff0c;缺少web功能&#xff0c;因此在配置tomcat server时&#xff0c;没有artifacts可选 目前已经解决了此问题&#xff0c;因此记录一下解决的方法步骤 配置artifacts 在idea中&#xff0c;依次点击Fi…

Idea的Artifacts

Artifacts&#xff08;Web部署-2&#xff09; 项目的打包部署设置&#xff0c;这个是项目配置里面比较关键的地方&#xff0c;重点说一下。 先理解下它的含义&#xff0c;来看看官方定义的artifacts&#xff1a; An artifact is an assembly of your project assets that you…

IDEA通过Artifacts发布Web项目

今天在用IDEA运行一个Java Web项目时突然报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver&#xff0c;但是我的项目的lib目录下以及添加了jdbc的连接jar包&#xff0c;而且在IDEA中编译没有报错&#xff0c;而且之后我自己添加的两个jar包也找不到&#xff0c;但…

idea Artifacts 配置

以Artifacts方式工作 什么是artifact&#xff1f; artifact是一种用于装载项目资产以便于测试&#xff0c;部署&#xff0c;或者分布式软件的解决方案。例如集中编译class&#xff0c;存档java应用包&#xff0c;web程序作为目录结构&#xff0c;或者web程序存档等。 artifact …

IDEA中的Build Artifacts详解

使用IDEA编写完JAVA代码&#xff0c;需要对外发布时&#xff0c;我们就会用到IDEA的Build Artifacts...功能。在没有创建Artifact时&#xff0c;菜单“Build”|"Build Artifacts..."是灰化的&#xff0c;不可用。所以&#xff0c;第一步是进入project structure创建A…

No artifacts configured

在配置tomcat得时候出现这种情况有可能是&#xff0c;IDEA中没有导入web得框架。 1、点击项目得添加框架这个选项 2、选上&#xff0c;点击ok即可。这是再去看tomcat中就会出现artifacts。

Idea配置项目的tomcat时候没有Artifacts的最全解决办法

很多时候导入别人的项目&#xff0c;配置tomcat的时候会发现没有Artifacts&#xff0c;这种情况可能有两个原因&#xff0c;任何一个原因都可能导致Artifacts没有。 原因一&#xff1a; 没有勾选maven的一些选项导致的&#xff0c;不过这个原因其实很少会发生。解决办法如下&a…

关于Facet、Artifacts概念等

转自&#xff1a;https://www.cnblogs.com/bityinjd/p/9284378.html Facet的作用就是配置项目框架类支持。 比如我们现在要开发的是一个 web 项目&#xff0c;那就需要 web 相关的 Facet&#xff0c;事实上&#xff0c;如果没有这个配置支持&#xff0c;编译器也不知道这个项…