常用Java代码-Java中的多线程编程(Multi-threading)

多线程编程是Java中的一个重要概念,它允许程序在同一时刻执行多个任务,提高程序的执行效率和响应性。在Java中,多线程编程通过创建多个线程并利用线程来执行任务实现。

Java提供了Thread类和Runnable接口来实现多线程编程。Thread类是Java中的一个内置类,可以直接继承它来创建线程。Runnable接口是一个标准接口,通过实现该接口来定义线程执行的代码逻辑。

在多线程编程中,需要注意线程安全问题。线程安全是指在多线程环境下,多个线程同时访问共享资源时,能够保证数据的一致性和正确性。为了实现线程安全,Java提供了同步机制、锁机制等并发控制手段来保证线程安全。

除了线程安全问题,多线程编程还涉及到线程间的通信、线程的优先级和调度等问题。Java提供了多种机制来实现线程间的通信,例如wait()和notify()方法、信号量机制等。同时,Java也提供了线程池等技术来管理和复用线程资源,提高程序的执行效率。

一、Java中的多线程编程(Multi-threading)

public class ThreadExample {public static void main(String[] args) {Thread thread1 = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 1: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 2: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});thread1.start(); // 启动线程1thread2.start(); // 启动线程2}
}
public class ThreadExample {public static void main(String[] args) {Thread thread1 = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 1: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 2: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});thread1.start(); // 启动线程1thread2.start(); // 启动线程2}
}
public class ThreadExample {public static void main(String[] args) {Thread thread1 = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 1: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 2: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});thread1.start(); // 启动线程1thread2.start(); // 启动线程2try {thread1.join(); // 主线程等待线程1执行完毕thread2.join(); // 主线程等待线程2执行完毕} catch (InterruptedException e) {e.printStackTrace();}}
}
public class ThreadExample {public static void main(String[] args) {Thread thread1 = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 1: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 2: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});thread1.start(); // 启动线程1thread2.start(); // 启动线程2try {thread1.join(); // 主线程等待线程1执行完毕thread2.join(); // 主线程等待线程2执行完毕} catch (InterruptedException e) {e.printStackTrace();}System.out.println("All threads have finished."); // 所有线程执行完毕后打印一条消息}
}

这个示例中,我们使用了Thread.start()方法来启动线程,并且使用Thread.join()方法来让主线程等待其他线程执行完毕。我们还使用了Thread.sleep()方法来让每个线程休眠一秒,以模拟线程的执行过程。在所有线程执行完毕后,主线程打印一条消息,表示所有线程已经完成执行。

您还可以考虑使用同步机制来控制线程之间的执行顺序,例如使用synchronized关键字或Lock接口。这样可以在某些情况下确保线程之间的互斥访问,避免出现并发问题。

此外,您还可以使用线程池来管理线程的创建和销毁,以提高程序的性能和稳定性。线程池可以预先创建一定数量的线程,并在需要时分配给任务执行,避免频繁地创建和销毁线程。

以下是一个使用线程池的示例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2); // 创建一个固定大小的线程池executor.execute(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 1: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});executor.execute(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread 2: " + i);try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}}});executor.shutdown(); // 关闭线程池}
}

在这个示例中,我们使用了ExecutorService接口来创建一个固定大小的线程池,并使用executor.execute()方法来提交任务给线程池执行。最后,我们调用executor.shutdown()方法来关闭线程池。

此外,Java 并发编程库还提供了其他有用的工具,例如CountDownLatchCyclicBarrierPhaser等,这些工具可以帮助您更好地控制线程之间的协作和同步。

CountDownLatch允许一个或多个线程等待其他线程完成一系列操作,CyclicBarrier允许一组线程相互等待,直到所有线程都达到某个状态,而Phaser则是一种更通用的同步工具,它支持多阶段同步和动态线程注册。

以下是使用CountDownLatch的一个示例:

import java.util.concurrent.CountDownLatch;public class ThreadExample {public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(2); // 初始化为2的计数器Thread thread1 = new Thread(() -> {System.out.println("Thread 1 started");try {Thread.sleep(1000); // 线程休眠一秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread 1 finished");latch.countDown(); // 计数器减一});Thread thread2 = new Thread(() -> {System.out.println("Thread 2 started");try {Thread.sleep(2000); // 线程休眠两秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread 2 finished");latch.countDown(); // 计数器减一});thread1.start(); // 启动线程1thread2.start(); // 启动线程2latch.await(); // 主线程等待计数器归零System.out.println("All threads have finished."); // 所有线程执行完毕后打印一条消息}
}

在这个示例中,我们使用了CountDownLatch来控制两个线程的执行顺序。主线程等待两个线程都完成执行,然后继续执行后续操作。

另外,对于更复杂的并发编程场景,例如多线程数据处理、任务调度和数据共享等,Java还提供了高级的并发编程框架,例如Java Concurrency API和CompletableFuture等。这些框架使得多线程编程更加高效、可靠和简洁。

使用这些高级并发编程工具,您可以更加灵活地控制线程的执行流程,避免数据竞争和死锁等问题,并提高程序的性能和响应速度。

总之,Java多线程编程是一个复杂而重要的领域,需要深入学习和实践。通过掌握基本的线程概念、同步机制和并发编程工具,您将能够更好地应对多线程编程的挑战,并编写出高效、稳定和可维护的并发程序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FileStream文件管理

文件管理 FileStream&#xff1a;是一个用于读写文件的一个类。它提供了基于流的方式操作文件&#xff0c;可以进行读取、写入、查找和关闭等操作。 第一个参数&#xff1a;path&#xff08;路径&#xff09; 相对路径&#xff1a;相对于当前项目的bin目录下的Debug和Realse来…

EMD+包络谱故障诊断

EMD是一种信号处理方法,用于将信号分解成多个本征模态函数(Intrinsic Mode Functions,IMF),每个IMF代表信号中的一个固有振动模式。VMD在处理非平稳信号和非线性信号方面具有较好的性能。 包络谱峭度是一种用于描述信号包络频谱形状的特征。它通过对信号包络谱的谱线斜率…

[嵌入式AI从0开始到入土]10_yolov5在昇腾上应用

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

Android 车联网——多屏多用户(十五)

前面几篇文章介绍了多用户和多屏相关的 Manager 和 Service。上一篇文章最后虽然车内乘员都根据配置有自己的对应屏幕,但默认情况下,所有车内乘员依然使用的是当前主用户(司机用户),这一篇我们继续放下看一下用户的创建与分配。 一、用户创建分配 1、创建用户 对于创建用…

【AI视野·今日NLP 自然语言处理论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 5 Jan 2024 Totally 28 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers LLaMA Pro: Progressive LLaMA with Block Expansion Authors Chengyue Wu, Yukang Gan, Yixiao Ge, Zeyu Lu, …

JavaScript实现的复杂功能:自动生成带水印的图片

#程序员的崩溃瞬间 在本文中&#xff0c;我们将讨论一个JavaScript实现的复杂功能&#xff0c;该功能可以自动为图片添加水印。这个功能在许多场景中都非常有用&#xff0c;例如&#xff0c;如果你想保护你的图片版权&#xff0c;或者你想在你的网站上显示自定义的水印。 一、…

java导出word套打

这篇文档手把手教你完成导出word套打&#xff0c;有这个demo&#xff0c;其他word套打导出都通用。 1、主要依赖 <!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.0</ve…

IPv6路由协议---IPv6动态路由(RIPng)

IPv6动态路由协议 动态路由协议有自己的路由算法,能够自动适应网络拓扑的变化,适用于具有一定数量三层设备的网络。缺点是配置对用户要求比较高,对系统的要求高于静态路由,并将占用一定的网络资源和系统资源。 路由表和FIB表 路由器转发数据包的关键是路由表和FIB表,每…

CreateDIBSection失败的问题记录

错误记录 [ERROR] (:0, ): QPixmap::fromWinHICON(), failed to GetIconInfo() (操作成功完成。) [ERROR] (:0, ): QPixmap::fromWinHICON(), failed to GetIconInfo() (参数错误。) [ERROR] (:0, ): QPixmap::fromWinHICON(), failed to GetIconInfo() (参数错误。) [ERROR] …

升级 Vite 5 出现警告 The CJS build of Vite‘s Node API is deprecated.

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

C++核心编程——内存分区、引用、函数提高和函数重载

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

数仓建设学习路线(一)

前言 数仓建设实践路线是语兴发布在B站的系列课程&#xff0c;搜索语兴呀即可学习完整的数仓建设理论。 大数据相关岗位 大数据常见的岗位主要包括实时开发、数据治理、数据安全、数据资产等。 其中&#xff1a; 实时开发组的主要任务是实时可视化制作(大屏/彩蛋/战报&…

前端结合MQTT实现连接 订阅发送信息等操作 VUE3

MQTT客户端下载 使用测试 在我之前文章中 MQTT下载基础使用 下面记录一下前端使用的话的操作 1.安装 npm i mqtt引入 import * as mqtt from "mqtt/dist/mqtt.min"; //VUE3 import mqtt from mqtt //VUE2 一、MQTT协议中的方法 Connect。等待与服务器建立连接…

Scanner:键盘输入功能的实现、Java程序获取一个随机数

目录 一、 Scanner&#xff1a;键盘输入功能的实现 二、Java程序获取一个随机数 一、 Scanner&#xff1a;键盘输入功能的实现 如何从键盘获取不同类型&#xff08;基本数据类型、String类型&#xff09;的变量&#xff1a;使用Scanner类 键盘输入代码的四个步骤&#xff1a…

uView Gap 间隔槽

该组件一般用于内容块之间的用一个灰色块隔开的场景&#xff0c;方便用户风格统一&#xff0c;减少工作量 #平台差异说明 App&#xff08;vue&#xff09;App&#xff08;nvue&#xff09;H5小程序√√√√ #基本使用 直接引入即可使用 通过height配置高度&#xff0c;单位…

fmt中uint128_fallback的实现分析

数据结构 class uint128_fallback {private:uint64_t lo_, hi_;public:constexpr uint128_fallback(uint64_t hi, uint64_t lo) : lo_(lo), hi_(hi) {}constexpr uint128_fallback(uint64_t value 0) : lo_(value), hi_(0) {}constexpr uint64_t high() const noexcept { ret…

[VUE]2-vue的基本使用

目录 vue基本使用方式 1、vue 组件 2、文本插值 3、属性绑定 4、事件绑定 5、双向绑定 6、条件渲染 7、axios 8、⭐跨域问题 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅…

气膜建筑:舒适、智能、可持续

气膜建筑之所以能够拥有广阔的发展空间&#xff0c;源于其融合了诸多优势特点&#xff0c;使其成为未来建筑领域的前沿趋势。 气膜建筑注重环境可持续性和能源效率。在材料和设计上&#xff0c;它采用可回收材料、提高热保温效果&#xff0c;并积极利用太阳能等可再生能源&…

【洛谷学习自留】p9226 糖果

解题思路&#xff1a; 简单的计算题&#xff0c;用n对k取余&#xff0c;如果余数为0&#xff0c;则输出k的值&#xff0c;否则输出&#xff08;k-余数&#xff09;的值。 代码实现&#xff1a; import java.util.Scanner;public class p9226 {public static void main(Strin…

Go、Docker、云原生学习笔记全攻略:从零开始,一步步走向精通!(2024版)

第一章、Go语言学习宝典 一、介绍 01.Go 语言的前生今世 二、开发环境搭建 01.Go 语言开发环境搭建 三、初识GO语言 01.Go 多版本管理工具 02.第一个 Go 程序“hello&#xff0c;world“ 与 main 函数 03.Go 常用命令介绍 04.Go 项目代码布局 05.探索 GO 项目依赖包管…