当前位置: 首页 > news >正文

多线程的创建与同步

目录

线程的创建

1.多线程的创建:方式一:继承于Thread类

2.多线程的创建:方式二:实现Runnable  

3..线程创建方式三:实现Callable接口  

线程的同步

1.同步的方式:方式一:同步代码块 

2.同步的方式二:同步方法:

3.线程同步的方法三:Lock锁

4.案例:三个线程交替打印数组元素


线程的创建

1.多线程的创建:方式一:继承于Thread类

        1.创建一个继承于thread类的子类。

        2.重写thread类的run()

        3.创建thread类的子类的对象

        4.通过此对象调用start()

public class MyThreadTest {public static void main(String[] args) {//3.创建Thread类的子类的对象Thread1 thread1 = new Thread1();//4.通过该对象调用start()方法thread1.start();}}
//1.创建一个继承了Thread类的子类
class Thread1 extends Thread {//2.重写Thread类的run()方法@Overridepublic void run() {System.out.println("线程实现方式一:继承Thread类方式");}
}

2.多线程的创建:方式二:实现Runnable  

        1.创建一个实现了Runnable接口的类

        2.实现类去实现Runnable中的抽象方法run

        3.创建实现类的对象

        4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象

        5.通过Thread类的对象调用start()
 

public class MyThreadTest {public static void main(String[] args) {//3.创建该实现类的对象Thread2 thread2 = new Thread2();//4.将该对象作为参数传递到Thread类的构造器中,创建Thread类的对象Thread thread3 = new Thread(thread2);//5.通过Thread类的对象调用start()方法thread3.start();}
}
//1.创建一个实现了Runnable接口的实现类
class Thread2 implements Runnable{//2.重写run()方法@Overridepublic void run() {System.out.println("线程实现方式二:实现Runnable接口方式");}
}

3..线程创建方式三:实现Callable接口  

        1.创建一个实现Callable的实现类

        2.实现call()方法,将此线程需要执行的方法声明在call()中

        3.创建callable实现类的对象

        4.将此实现类对象作为参数传递到FutureTask构造器中,创建FutureTask对象

        5.将FutureTask对象作为参数传递到Thread类中调用start()

        6.可以获取Callable中call方法的返回值

class CallableTest implements Callable {@Overridepublic Object call() throws Exception {int sum = 0;for (int i = 0; i <= 100; i++) {if (i % 2 == 0){Thread.sleep(100);System.out.println(Thread.currentThread().getName() + ":" + i);sum += i;}}return sum;}}
public class Demo1 {public static void main(String[] args) {CallableTest c = new CallableTest();FutureTask f = new FutureTask(c);Thread t1 = new Thread(f);Thread t2 = new Thread(f);t1.setName("线程1");t2.setName("线程2");t2.start();t1.start();try {Object sum = f.get();System.out.println(sum);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}

线程的同步

1.同步的方式:方式一:同步代码块 

        1.同步代码块:实现Runnable的形式

                synchronized(同步监视器){需要被同步代码}

        2.说明:操作共享数据的代码,即为需要被同步的代码。

        3.同步监视器,俗称锁;任何类的对象都可以充当锁;

        4.要求:多个线程必须共用同一把锁。

        5.在实现Runnable接口创建多线程的方式中,可以考虑使用this作为锁;

        6.在继承Thread类创建多线程的方式中,慎用this充当锁,可以使用当前类充当同步监视器

class Window1 implements Runnable{private int ticket = 100;Object obj = new Object();@Overridepublic void run() {while(true){//使用类的对象充当同步监视器
//            synchronized(obj){//使用当前类充当同步监视器
//            synchronized(Window1.class){//使用this充当同步监视器synchronized(this){if (ticket > 0){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ":购票成功,票号为:" + ticket);ticket--;}else{break;}}}}
}

2.同步的方式二:同步方法:

        1.如果操作共享数据的代码完整的声明在一个方法中,我们可以将此方法声明为同步

        2.需要将共享数据和同步方法写成静态形式

class Window2 implements Runnable{private static int ticket = 100;@Overridepublic void run() {while(true){getTicket();}}private static synchronized void getTicket(){//默认是一个thisif (ticket > 0){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ":购票成功,票号为:" + ticket);ticket--;}}

3.线程同步的方法三:Lock锁

        1.先使用reentrant lock实例化

        2.在try中调用锁定方法:lock()

        3.在finally中调用解锁方法:unlock()

class Window implements Runnable{private int ticket = 100;ReentrantLock lock = new ReentrantLock();@Overridepublic void run() {while(true){try {lock.lock();if (ticket > 0) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ":购票成功,票号为:" + ticket);ticket--;} else {break;}}finally{lock.unlock();}}}
}

4.案例:三个线程交替打印数组元素

        使用三个线程交替打印出数组元素

//实现三个线程交替打印数组元素
public class ThreeThreadPrint {//生成数组元素private static int[] arr = {1,2,3,4,5,6,7,8,9};//记录数组索引private static int currIndex = 0;public static void main(String[] args) {Thread thread1 = new Thread(new ThreadTemp(0));Thread thread2 = new Thread(new ThreadTemp(1));Thread thread3 = new Thread(new ThreadTemp(2));thread1.start();thread2.start();thread3.start();}static class ThreadTemp implements Runnable{//记录线程IDprivate int threadId;public ThreadTemp(int threadId){this.threadId = threadId;}@Overridepublic void run() {synchronized (this) {while(currIndex < arr.length) {if (currIndex % 3 == threadId) {System.out.println("ThreadID:" + threadId + ":" + arr[currIndex]);currIndex++;}}}}}
}

相关文章:

多线程的创建与同步

目录 线程的创建 1.多线程的创建&#xff1a;方式一&#xff1a;继承于Thread类 2.多线程的创建&#xff1a;方式二&#xff1a;实现Runnable 3..线程创建方式三&#xff1a;实现Callable接口 线程的同步 1.同步的方式&#xff1a;方式一&#xff1a;同步代码块 2.…...

LLMs 缩放指令模型Scaling instruct models FLAN(Fine-tuned LAnguage Net,微调语言网络)

本论文介绍了FLAN&#xff08;Fine-tuned LAnguage Net&#xff0c;微调语言网络&#xff09;&#xff0c;一种指导微调方法&#xff0c;并展示了其应用结果。该研究证明&#xff0c;通过在1836个任务上微调540B PaLM模型&#xff0c;同时整合Chain-of-Thought Reasoning&#…...

政务大厅人员睡岗离岗玩手机识别算法

人员睡岗离岗玩手机识别算法通过pythonyolo系列网络框架算法模型&#xff0c;人员睡岗离岗玩手机识别算法利用图像识别和行为分析&#xff0c;识别出睡岗、离岗和玩手机等不符合规定的行为&#xff0c;并发出告警信号以提醒相关人员。Python是一种由Guido van Rossum开发的通用…...

认识Mybatis的关联关系映射,灵活关联表对象之间的关系

目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…...

如何开发一款唯一艺术平台 区块链 /数字藏品

艺术作品是人类文化的瑰宝&#xff0c;而艺术平台则是连接艺术家与观众的桥梁。如何开发一款独一无二的艺术平台&#xff0c;既要满足专业艺术作品展示的要求&#xff0c;又要提供深度思考的空间&#xff0c;这是我们所面临的挑战。本文将从专业性、思考深度和逻辑性等多个方面…...

【UniApp开发小程序】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】

声明 本文提炼于个人练手项目&#xff0c;其中的实现逻辑不一定标准&#xff0c;实现思路没有参考权威的文档和教程&#xff0c;仅为个人思考得出&#xff0c;因此可能存在较多本人未考虑到的情况和漏洞&#xff0c;因此仅供参考&#xff0c;如果大家觉得有问题&#xff0c;恳…...

运维高级学习--Kubernetes(K8s 1.28.x)部署

一、基础环境配置&#xff08;所有主机操作&#xff09; 主机名规划 序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2…...

Apache zookeeper kafka 开启SASL安全认证 —— 筑梦之路

简介 Kafka是一个高吞吐量、分布式的发布-订阅消息系统。Kafka核心模块使用Scala语言开发&#xff0c;支持多语言&#xff08;如Java、Python、Go等&#xff09;客户端&#xff0c;它可以水平扩展和具有高吞吐量特性而被广泛使用&#xff0c;并与多类开源分布式处理系统进行集成…...

lintcode 1017 · 相似的RGB颜色【进制计算】

题目链接&#xff0c;题目描述 https://www.lintcode.com/problem/1017 在本题中&#xff0c;每个大写字母代表从“0”到“f”的一些十六进制数字。红绿蓝三元色#AABBCC可以简写为#ABC。 例如&#xff0c;#15c是颜色#1155cc的简写。现在&#xff0c;定义两种颜色#ABCDEF和#UV…...

全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢

展示突破性创新技术&#xff0c;共话行业发展趋势。8月25日&#xff0c;全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下&#xff0c;由浙…...

采用 UML 对软件系统进行建模的基本框架

UML 包括一些可以相互组合为图标的图形元素&#xff0c; 通过提供不同形式的图形来 表述从软件分析开始的软件开发全过程的描述&#xff0c;一个图就是系统架构在某个侧面的 表示&#xff0c;所有的图组成了系统的完整视图。UML 主要提供了以下五类图&#xff1a; &#xff…...

编译tiny4412 Linux 内核

工作环境 Ubuntu 22 交叉编译器 4.5.1 解压Linux内核源码&#xff0c;进入目录 将官方配置完好的defconfig文件作为配置文件 cp tiny4412_linux_defconfig .config由于内核版本较低&#xff0c;需要下载低版本的gcc&#xff0c;选择下载gcc-9与g9 sudo apt install gcc-9 g-…...

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发&#xff1a;Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统&#xff0c;我还是写一下以便将来用到或参考&#xff5e; 了解 安装Ubuntu22.04&#xff08;截至2023年08月26日11&#xff…...

SpringBoot简单上手

spring boot 是spring快速开发脚手架&#xff0c;通过约定大于配置&#xff0c;优化了混乱的依赖管理&#xff0c;和复杂的配置&#xff0c;让我们用java-jar方式,运行启动java web项目 入门案例 创建工程 先创建一个空的工程 创建一个名为demo_project的项目&#xff0c;并且…...

git及GitHub的使用

文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐&#xff0c;现在用起来比较麻烦)ssh连接&#xff08;推荐&#xff09;git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注&#xff1a; 下载完…...

【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)

文章目录 引言一、线性方程组的基本概念与表达形式二、线性方程组解的基本定理三、线性方程组解的结构写在最后 引言 继向量的学习后&#xff0c;一鼓作气&#xff0c;把线性方程组也解决了去。O.O 一、线性方程组的基本概念与表达形式 方程组 称为 n n n 元齐次线性方程组…...

使用Python写入数据到Excel:实战指南

在数据科学领域&#xff0c;Excel是一种广泛使用的电子表格工具&#xff0c;可以方便地进行数据管理和分析。然而&#xff0c;当数据规模较大或需要自动化处理时&#xff0c;手动操作Excel可能会变得繁琐。此时&#xff0c;使用Python编写程序将数据写入Excel文件是一个高效且便…...

接口测试总结分享(http与rpc)

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 一、了解一下HTTP与RPC 1. HTTP&#xff08;H…...

数据结构(Java实现)LinkedList与链表(下)

** ** 结论 让一个指针从链表起始位置开始遍历链表&#xff0c;同时让一个指针从判环时相遇点的位置开始绕环运行&#xff0c;两个指针都是每次均走一步&#xff0c;最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下&#xff1a; 也…...

linux查看正在运行的nginx在哪个文件夹当中

1、查出Nginx进程PID ps -ef|grep nginx2、查看Nginx进程启动时的工作目录 ls -la /proc/<PID>/cwd将<PID>替换为第一步中列出的Nginx进程的PID。该命令会显示Nginx进程在启动时所在的工作目录&#xff08;当前工作目录&#xff09;...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...