线程的中断和同步问题

1、自动终断【完成】:一个线程完成执行后(即run方法执行完毕),不能再次运行 。

2、手动中断:

stop( ) —— 已过时,基本不用。(不安全,就像是突然停电)

interrupt( ) ——此方法只是改变中断状态,不会中断一个正在运行的线程。比如:如果当前线程是阻塞状态,那么就结束阻塞状态

3、可通过使用一个标志指示 run 方法退出,从而终止线程(推荐使用)

使用场景

  • 点击某个桌面应用中的取消按钮时;
  • 某个操作超过了一定的执行时间限制需要中止时;
  • 多个线程做相同的事情,只要一个线程成功其它线程都可以取消时;
  • 一组线程中的一个或多个出现错误导致整组都无法继续时;
  • 当一个应用或服务需要停止时
  • interrupt( )方法说明:interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程检查到中断标识,就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。

 线程同步问题

同步解决方案synchronized

1.在java语言中,引入了同步锁的概念,每个对象都有一个与之关联的内部锁(排他锁),用以保证共享数据的安全性问题。

2.关键词synchronized用来给某个方法或某段代码加上一个同步锁。

3.当调用者调用此方法时,必须获得这把锁才可以调用。

4.当某个调用者获得这把锁之后,其他调用者就无法获得了。

5.当调用结束后,调用者释放这把锁,此时其他调用者才可以获得。

6.这个机制保障了某个同步方法同时只能有一个调用者

锁定方法

public class Account {private int balance = 1000;public  synchronized void qu(){ // 同步方法if(balance>=1000){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}balance -= 1000;System.out.println("取了1000元,balance = " + balance);}}
}

 锁定代码块

public class Account {private int balance = 1000;public   void qu(){System.out.println("Account.qu");synchronized( "this" ){ // 同步块if(balance>=1000){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}balance -= 1000;System.out.println("取了1000元,balance = " + balance);}}}
}

死锁

 

线程同步的第二种解决方案 wait() notify()

生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个线程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它

package test06;
//仓库(有界缓冲区)
class Storage{private int count = 0;public synchronized void set(){if(count>=5){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}count++;System.out.println("生产了一个,仓库中有:" + count);this.notify();}public synchronized void get(){if(count<=0){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}count--;System.out.println("消费了一个,仓库中有:" + count);this.notify();}
}
//生产者
class Producer extends Thread{private Storage storage;public Producer(Storage storage){this.storage = storage;}public void run(){for(int i=0;i<50;i++){this.storage.set();}}
}
//消费者
class Customer extends Thread{private Storage storage;public Customer(Storage storage){this.storage = storage;}public void run(){for(int i=0;i<50;i++){this.storage.get();}}
}
public class Test2 {public static void main(String[] args) {Storage storage = new Storage();Producer producer = new Producer(storage);Customer customer = new Customer(storage);customer.start();producer.start();}
}

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

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

相关文章

从0到1搭建数据中台(4):neo4j初识及安装使用

在数据中台中&#xff0c;neo4j作为图数据库&#xff0c;可以用于数据血缘关系的存储 图数据库的其他用于主要用于知识图谱&#xff0c;人物关系的搭建&#xff0c;描述实体&#xff0c;关系&#xff0c;以及实体属性 安装 在官网 https://neo4j.com/ 下载安装包 neo4j-co…

系统架构师考点--面向对象开发

大家好。今天再来总结一下面向对象的相关考点。面向对象技术。这部分在上午场客观题一般占3-5分左右。下午的案例题和论文题也可能有所涉及。 一、面向对象开发 (1)对象&#xff1a;由数据及其操作所构成的封装体&#xff0c;是系统中用来描述客观事务的个实体&#xff0c;是…

【算法/天梯赛训练】天梯赛模拟题集

L1-009 N个数求和 #include <iostream> #include <algorithm>using namespace std;typedef long long ll; const int N 105;typedef struct node {ll x, y; }node; node a[N];ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a; }int main() {int n;cin >>…

Lua基础知识入门

1 基础知识 标识符&#xff1a;标识符的定义和 C语言相同&#xff1a;字母和下划线_ 开头&#xff0c; 下划线_ 大写字母一般是lua保留字&#xff0c; 如_VERSION 全局变量&#xff1a;默认情况下&#xff0c;变量总是认为是全局的&#xff0c;不需要申明&#xff0c;给一个变…

ECMP等价多路由机制,大模型训练负载均衡流量极化冲突原因,万卡(大规模)集群语言模型(LLM)训练流量拥塞特点

大规模集群&#xff0c;大语言模型(LLM)训练流量特点&#xff0c;ECMP&#xff08;Equal-Cost Multi-Path Routing&#xff09;流量极化拥塞原因。 视频分享在这&#xff1a; 2.1 ECMP等价多路由&#xff0c;大模型训练流量特点&#xff0c;拥塞冲突极化产生原因_哔哩哔哩_bi…

vue2导入elementui组件库

第一步安装 npm i element-ui -S 第二步在main.js中导入 第三步使用然后在运行项目

Linux——五种IO模型

目录 一、I/O的理解 二、五种IO模型 1.阻塞式IO 2.非阻塞式IO 3.信号驱动IO 4.多路复用IO 5.异步IO 一、I/O的理解 I/O的本质就是输入输出&#xff0c;C语言的stdio&#xff0c;C的iostream&#xff0c;添加了这两个库&#xff0c;我们才能够进行printf、scanf、cin、c…

【HarmonyOS】HarmonyOS NEXT学习日记:三、初识ArkUI

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;三、初识ArkUI 忘掉HTML和CSS&#xff0c;ArkUI里构建页面的最小单位就是 “组件”&#xff0c;所以今天的目标就是认识一些常用的基础组件&#xff0c;以及他们的用法&#xff0c;对ArkUI形成一个基本认识。 基本组成 了解…

【前端】表单密码格式—校验。

如图&#xff1a;实现表单输入密码和确认密码的时候进行表单校验。 实现方式&#xff1a; 1.在代码的data里面定义&#xff0c;函数验证的方法。如图所示,代码如下 【代码】如下&#xff1a; const validatePassword (rule, value, callback) > {if (value ) {callback(n…

MongoDB自学笔记(三)

一、前文回顾 上一篇文章中我们学习了更新操作&#xff0c;以及讲解了部分的更新操作符&#xff0c;今天我们继续学习剩余的更新操作符。 二、更新操作符 1、$rename 语法&#xff1a;{ $rename: { < field1 >: < newName1 >, < field2 >: < newName2…

Java语言程序设计基础篇_编程练习题**14.29(游戏:豆机)

第十四章第二十九题 **14.29 (游戏&#xff1a;豆机) 请写一个程序&#xff0c;显示编程练习题 7.21 中介绍的豆机&#xff0c;如图 14-52c 所示 代码展示 package chapter_14;import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layou…

【ffmpeg命令入门】重新编码媒体流、设置码率、设置帧速率

文章目录 前言ffmpeg的描述重新编码媒体流重新编码媒体流的命令ffmpeg支持的媒体流 设置视频码率视频码率是什么设置视频的码率 设置文件帧数率帧数率是什么ffmpeg设置帧数率 总结 前言 在数字媒体处理领域&#xff0c;ffmpeg是一款非常强大的工具&#xff0c;它可以用来进行媒…

Java | Leetcode Java题解之第242题有效的字母异位词

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isAnagram(String s, String t) {if (s.length() ! t.length()) {return false;}int[] table new int[26];for (int i 0; i < s.length(); i) {table[s.charAt(i) - a];}for (int i 0; i < t.leng…

【面试题】Redo log和Undo log

Redo log 介绍Redo log之前我们需要了解一下&#xff0c;mysql数据操作的流程&#xff1a; 上述就是数据操作的流程图&#xff0c;可以发现sql语句并不是直接操作的磁盘而是通过操作内存&#xff0c;然后进行内存到磁盘的一个同步。这里我们必须要了解一些区域&#xff1a; 缓…

基于 asp.net家庭财务管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用感兴趣的可以先…

抖音seo短视频账号矩阵系统源码-SaaS开源部署流程开发者技术分享

抖音seo账号矩阵系统&#xff0c;短视频矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“管理平台。使用矩阵系统也能保证账号的稳定性&#xff0c;降低账号的风险…

redis数据持久化之RDB大战AOF

华子目录 数据持久化RDB什么是RDB如何备份Fork持久化流程rdb持久化过程一、触发RDB持久化的方式二、RDB持久化的具体过程三、RDB持久化的优缺点 相关配置1.db文件名2.rdb文件和aof文件路径3.save示例 4.stop-writes-on-bgsave-errorstop-writes-on-bgsave-error 的配置选项和含…

Unity3d开发google chrome的dinosaur游戏

游戏效果 游戏中&#xff1a; 游戏中止&#xff1a; 一、制作参考 如何制作游戏&#xff1f;【15分钟】教会你制作Unity小恐龙游戏&#xff01;新手15分钟内马上学会&#xff01;_ unity教学 _ 制作游戏 _ 游戏开发_哔哩哔哩_bilibili 二、图片资源 https://download.csdn.…

ELK企业级日志分析

目 录 一、ELK简介 1.1 elasticsearch简介 1.2 logstash简介 1.3 kibana简介 1.4 ELK的好处 1.5 ELK的工作原理 二、部署ELK 2.1 部署elasticsearch(集群) 2.1.1 修改配置文件 2.1.2 修改系统参数 2.1.2.1 修改systemmd服务管理器 2.1.2.2 性能调优参数 2.1.2.3 …

电源模块企业该如何解决测试中的痛点问题?

根据研究发现&#xff0c;超过76%的企业在进行测试时会对产品质量、可靠性和测试速度这三项核心指标尤为重视。但是随着近几年的发展&#xff0c;目前的测试方法和措施对于这三项指标的测试远远无法达到企业的预期。被测产品的整体质量参差不齐、测试数据的可靠性以及测试的速度…