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

JAVA--多线程

Java中的多线程是指在同一个Java虚拟机(JVM)中并发执行多个线程的能力。线程是程序执行的最小单元,Java提供了丰富的API来创建和管理线程。以下是Java中实现多线程的一些关键概念和方法:

  1. Thread 类:Java提供了Thread类来创建和管理线程。通过继承Thread类并重写其run()方法,可以定义线程执行的任务。

  2. Runnable 接口:Java还提供了Runnable接口,它包含一个run()方法。实现Runnable接口的类可以被传递给Thread类的构造器,从而创建一个新的线程。

  3. 创建线程:可以通过继承Thread类或实现Runnable接口来创建线程。然后,通过调用start()方法启动线程。

  4. 生命周期:线程有几种状态,包括新建、就绪、运行、阻塞和死亡。线程状态的变化由线程的生命周期管理。

  5. 同步:当多个线程访问共享资源时,需要同步以避免数据不一致。Java提供了synchronized关键字和ReentrantLock等同步机制。

  6. 线程池:Java提供了线程池(ExecutorService)来管理线程的创建和销毁,提高资源利用率和执行效率。

  7. 中断:线程可以被中断,这是线程间通信的一种方式。通过调用线程的interrupt()方法可以设置中断状态,而通过检查线程的isInterrupted()方法可以响应中断。

  8. 等待/通知机制:Java提供了wait()notify()notifyAll()方法,允许线程在某些条件下等待,或在条件满足时被唤醒。

  9. 死锁:当多个线程相互等待对方释放资源时,可能会发生死锁。Java提供了工具和方法来检测和避免死锁。

  10. 并发集合:Java并发包(java.util.concurrent)提供了线程安全的集合类,如ConcurrentHashMapCopyOnWriteArrayList等。

下面是一个简单的Java多线程示例,演示了如何创建和启动线程:

// 使用Runnable接口创建线程
class Task implements Runnable {private int taskId;public Task(int id) {this.taskId = id;}@Overridepublic void run() {System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());// 执行任务的代码}
}public class MultiThreadExample {public static void main(String[] args) {// 创建线程Thread thread1 = new Thread(new Task(1), "Thread-1");Thread thread2 = new Thread(new Task(2), "Thread-2");// 启动线程thread1.start();thread2.start();}
}

在这个示例中,我们定义了一个Task类实现了Runnable接口,并重写了run()方法来执行任务。然后在main方法中创建了两个线程,并通过调用它们的start()方法来启动它们。

Java多线程编程是一个复杂的话题,涉及到线程安全、性能优化、资源管理等多个方面。正确地使用多线程可以提高程序的性能和响应能力,但同时也需要小心处理线程间的交互和同步问题。

在Java中,实现线程间的同步和互斥主要依赖于同步机制,以下是一些常用的方法:

  1. synchronized 关键字

    • 可以用来修饰方法或者代码块。
    • 当一个线程访问一个对象的synchronized方法或者同步代码块时,它会获得这个对象的锁。
    • 其他线程必须等待锁释放后才能访问该对象的任何其他synchronized方法或同步代码块。
  2. wait() 和 notify() 方法

    • wait()方法使当前线程等待,直到其他线程调用相同对象的notify()notifyAll()方法。
    • notify()唤醒在此对象监视器上等待的单个线程,而notifyAll()唤醒所有在此对象监视器上等待的线程。
  3. Lock 接口和其实现类

    • Java并发API提供了java.util.concurrent.locks.Lock接口和一些实现类,如ReentrantLock
    • 这些锁提供了与synchronized关键字类似的功能,但提供了更多的灵活性,例如尝试非阻塞获取锁、可中断的锁获取、超时等待等。
  4. volatile 关键字

    • 确保变量的更新对所有线程立即可见。
    • 当一个线程修改了一个volatile变量的值,新值会立即同步到主内存中,其他线程可以立即看到这个新值。
  5. Atomic 类

    • Java并发API提供了一组原子类,如AtomicIntegerAtomicLong等,它们利用CAS(Compare-And-Swap)操作来保证操作的原子性。
  6. Concurrent 集合

    • java.util.concurrent包提供了线程安全的集合类,如ConcurrentHashMapCopyOnWriteArrayList等,它们内部实现了同步机制。
  7. CountDownLatch、CyclicBarrier、Semaphore 和 Exchanger

    • 这些是Java并发API提供的同步辅助类,用于控制多个线程之间的协调。

下面是一个使用synchronized关键字和wait()/notify()方法实现线程间同步的示例:

public class Counter {private int count = 0;public synchronized void increment() {count++;System.out.println("Count: " + count);// 当计数达到某个值时,通知等待的线程if (count >= 5) {notifyAll();}}public synchronized void waitForCount() throws InterruptedException {while (count < 5) {wait();}}public static void main(String[] args) {Counter counter = new Counter();Thread incrementer = new Thread(() -> {for (int i = 0; i < 10; i++) {counter.increment();}});Thread waiter = new Thread(() -> {try {counter.waitForCount();System.out.println("Count has reached 5 or more.");} catch (InterruptedException e) {e.printStackTrace();}});incrementer.start();waiter.start();}
}

在这个示例中,Counter类有两个同步方法:increment()waitForCount()increment()方法每次被调用时都会增加计数并打印当前计数。如果计数达到5或以上,它会调用notifyAll()来唤醒等待的线程。waitForCount()方法使用wait()来等待计数达到5。

请注意,使用同步机制时,需要小心避免死锁和性能问题。正确的同步策略取决于具体的应用场景和需求。

 笔者小,中,大厂均有面试经验,目前正在从事全栈开发工作,坚持每日分享java全栈开发知识与相关的面试真题,希望能够给大家带来帮助,同大家共同进步。

相关文章:

JAVA--多线程

Java中的多线程是指在同一个Java虚拟机&#xff08;JVM&#xff09;中并发执行多个线程的能力。线程是程序执行的最小单元&#xff0c;Java提供了丰富的API来创建和管理线程。以下是Java中实现多线程的一些关键概念和方法&#xff1a; Thread 类&#xff1a;Java提供了Thread类…...

ADB-DROM

# 读硬件信息 adb shell "cat /sys/block/mmcblk0/device/name" # MT6767/MT6768/MT6769/MT6762/MT6765/MT6761... # 频率档位 # 固定频率 adb shell "echo 0 > /sys/devices/platform/10012000.dvfsrc/helio-dvfsrc/dvfsrc_force_vcore_dvfs_opp" # …...

mysql 之 explain

1. 查看表的创建字段以及索引情况 show create table user_recommend; 2. 创建索引的原则&#xff1a;列的值比较离散 像性别字段&#xff0c;只有男&#xff0c;女 或者其他&#xff1b;expose字段&#xff0c;只有1分发&#xff0c;0不可分发。就不适宜在这种字段上添加索引…...

CentOS迁移案例 | 保障轨道交通安全、发挥基础设施效能,麒麟信安操作系统支撑某市轨道交通畅行无忧

为缓解城市交通拥堵难题&#xff0c;某市轨道交通公司计划新建一条贯穿城市关键区域、沿路设立20座站点的轨道交通线路&#xff0c;并基于麒麟信安操作系统构建轨道交通信号系统。 轨道交通信号系统是列车核心控制系统&#xff0c;负责列车运行的自动化控制&#xff0c;及对整…...

获取操作系统的信息(Go语言)

在 Go 语言中&#xff0c;你可以使用 runtime 和 os 包来查看操作系统的信息。以下是一些常见的操作系统信息获取方法&#xff1a; 1. 获取操作系统类型和架构信息 Go 的 runtime 包提供了基本的操作系统和架构信息&#xff1a; package mainimport ("fmt""r…...

【论文阅读】HuatuoGPT-II, One-stage Training for Medical Adaption of LLMs

总体概要 本文深入探讨了一款专为医疗领域设计的大规模语言模型——HuatuoGPT-II的创新、性能与应用。HuatuoGPT-II采用统一的单阶段训练流程&#xff0c;将传统的继续预训练和监督微调整合&#xff0c;有效解决了医疗数据的异质性问题&#xff0c;包括语言、体裁和格式差异&a…...

Excel表列序号

题目 给定一个Excel表格中的列名称&#xff0c;返回其相应的列序号。 例如&#xff0c; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...示例 1: 输入: "A" 输出: 1示例 2: 输入: "AB" 输出: 28示例 3: 输入: "ZY&…...

IOS 03 纯代码封装自定义View控件

本节将通过纯代码进行封装自定义View控件&#xff0c;以常用的设置页的item为例&#xff0c;实现UI效果如下&#xff1a; 1、创建SettingView继承自UIView import UIKitclass SettingView: UIView {} 2、重写 init() 和 required init?(coder: NSCoder) 方法 纯代码创建Set…...

比较结构加法及其逆运算

在行列可自由变换的平面上有等式 13&#xff08;3a11&#xff09;2*4a14a22*4a32*4a44*4a122*4a14 3a11在平面上可能得到6个不同的4点结构&#xff0c;这6个结构的比例为2&#xff1a;1&#xff1a;2&#xff1a;2&#xff1a;4&#xff1a;2. 现在从右向左算&#xff0c;计…...

44.【C语言】指针(重难点)(G)

目录 19.字符指针变量 *定义 *简单说明 *如果是字符串 *像数组一样指定访问常量字符串的字符 *练习 20.数组指针变量 *定义 *格式 *例子 问题1 问题2 *利用指针打印 21.二维数组传参的本质 *回顾 往期推荐 19.字符指针变量 *定义 指向字符的指针变量&#xff0c;用于存储字符…...

746. 使用最小花费爬楼梯-dp3

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/min-cost-climbing-stairs/description/从左向右填dp表 class Solutio…...

MPU6050详细介绍

一、MPU6050介绍 MPU6050是由三个陀螺仪和三个加速度传感器组成的6轴运动处理组件 内部主要结构&#xff1a;陀螺仪、加速度计、数字运动处理器DMP&#xff08;Digital Motion Processor&#xff09; MPU6050有两个IIC接口&#xff0c;第一IIC接口可作为主接口给单片机传输数…...

【分享】Excel的3个隐藏功能

我们在制作Excel表格的时候&#xff0c;有时候会包含一些敏感信息&#xff0c;为了确保这些数据的安全性&#xff0c;Excel提供了隐藏功能来保护工作表&#xff0c;下面小编分享3个Excel常用的隐藏功能&#xff0c;一起来看看如何设置吧&#xff01; 功能一&#xff1a;隐藏部分…...

Linux中的chown指令

chown&#xff08;change owner&#xff09;命令在 Linux 和其他类 Unix 系统中用于更改文件或目录的用户和/或组所有权。 基本用法 chown [选项] 用户名[:组名] 文件或目录 参数说明 用户名&#xff1a;指定新的文件或目录的所有者 组名&#xff1a;可选&#xff0c;指定新…...

UCOSIII内存管理机制详解

目录 前言 1. 内存管理概述 2. 内存区域&#xff08;存储区&#xff09;和内存块 3. 存储区控制块&#xff08;OS_MEM&#xff09; 4. 内存管理函数 5. 内存碎片问题 6. 注意事项 7.代码实现 7.1创建内存区域 7.2申请内存 7.3释放内存 前言 UCOSIII&#xff08;即Mi…...

Android12 显示框架之Transaction----client端

目录&#xff1a;Android显示终极宝典 在前面的章节中&#xff0c;应用通过createSurface()在surfaceflinger中创建了一层layer&#xff0c;紧接着要做的事情就是对这个layer设置一些属性&#xff08;或者叫状态&#xff09;&#xff0c;常设置的属性有位置、大小、z-order等等…...

在Windows上使用FRP搭建内网穿透:

FRP服务器端配置&#xff08;公网服务器&#xff09; 下载FRP&#xff1a; 访问FRP的GitHub发布页面&#xff1a;https://github.com/fatedier/frp/releases下载对应系统架构的frp_<version>_linux_amd64.tar.gz&#xff08;如果你的服务器是Linux系统&#xff09;或者f…...

TypeError: Cannot read properties of undefined (reading ‘scrollIntoView‘)(已解决)

问题复现&#xff1a;眨眼睛使用vitevue3实现跳转dom功能时使用了scrollIntoView方法&#xff0c;在打包上传以后使用该功能报错 小友可能会陷入误区&#xff0c;以为是函数方法有问题&#xff0c;毕竟在开发时是没有问题的&#xff0c; 而实际上呢问题出在获取节点失败了 在这…...

【解决】Unity Inspector 视窗脚本中文乱码问题

开发平台&#xff1a;Unity 2020 编程平台&#xff1a;Visual Studio 2022   问题描述 开发过程中&#xff0c;为便利化快速审阅代码内容&#xff0c;通过 Unity Inspector 确认代码内容与逻辑。但对于默认安装的 Visual Studio 编程平台&#xff0c;保存的 UTF- 8 脚本文件在…...

使用 C/C++访问 MySQL

目录 准备工作 尝试链接 MySQL Client MySQL 接口介绍 准备工作 保证 MySQL 服务有效。下载MySQL开发包&#xff08;可以在MySQL官网下载安装也可以在软件源安装&#xff09; MySQL 开发包通常会包含一些特定的头文件和库文件。您可以检查以下常见的路径&#xff1a; /us…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...