Java 多线程

JAVA多线程详解(超详细) 程序:开发写的代码称之为程序。程序就是一堆代码,一组数据和指令集,是一个静态的概念。进程(Process):将程序运行起来,我们称之为进程。进程是执行程序的一次执行过程,它是动态的概念。进程存在生命周期,也就是说程序随着程序的终止而销毁。进程之间是通过TCP/IP端口实现交互的。线程(Thread):线程是进程中的实际运作的单位,是进程的一条流水线,是程序的实际执行者,是最小的执行单位。通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程。线程是CPU调度和执行的最小单位。注意。 阅读详情

一、为何要使用多线程,多线程的有点在哪?

背景:只使用单个线程完成多个任务(调用多个方法),肯定比用多个线程来完成用的时间更短,
为何仍需多线程呢?
多线程程序的优点:
1.提高应用程序的相应,对图形化界面更有意义,可增强用户体验。
2.提高计算机系统CPU的利用率
3.改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改

二、多线程的创建和启动

Java语言的JVM允许程序运行多个线程,它通过Java.lang.Thread类来实现
Thread类的特性
每个线程是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体
通过该Thread对象的start()方法来调用这个线程

Thread的常用方法:

1.start():启动线程并执行相应的run()方法
2.run():子线程要执行的代码放在run()方法中
3.currentThread():静态的,调取当前线程
4.getName():获取此线程的名字
5.setName():设置此线程的名字
6.yield():调用此方法的线程释放当前CPU的执行权
7.join():在A线程中调用B线程的join()方法,表示当执行到此方法,A线程停止执行,
直至B线程执行完毕,A线程再接着join()知乎的代码执行
8.isAlive():判断当前线程是否还存活
9.sleep(long l):显式的让当前线程睡眠1毫秒
10.线程通信(任何object都存在该方法):wait()    notify() notifyAll()
线程的两种创建:继承和接口实现
1.接口实现
class Window1 implements Runnable {
	 int tinket = 100;

	public void run() {
			while (true) {
			
				if (tinket > 0) {
					System.out.println(Thread.currentThread().getName() + "售票,票号为" + tinket--);

				} else {
					break;
				}
			}
	}

}

public class CopyOfTestWindow1 {
	public static void main(String[] args) {
		Window1 w = new Window1();
		Thread t1= new Thread(w);
		Thread t2= new Thread(w);
		Thread t3= new Thread(w);
		
		t1.setName("窗口1");
		t2.setName("窗口2");
		t3.setName("窗口3");
		t1.start();
		t2.start();
		t3.start();
	}
}

2.继承
class Window extends Thread {
	static int tinket = 100;

	public void run() {

		while (true) {
			if (tinket > 0) {
				System.out.println(Thread.currentThread().getName() + "售票,票号为" + tinket--);

			} else {
				break;
			}
		}

	}

}

public class TestWindow {
	public static void main(String[] args) {
		Window w1 = new Window();
		Window w2 = new Window();
		Window w3 = new Window();
		w1.setName("窗口1");
		w2.setName("窗口2");
		w3.setName("窗口3");
		w1.start();
		w2.start();
		w3.start();
	}
}

此程序存在线程的安全问题:打印车票时,会出现重票、错票

1.线程安全问题存在的原因?
由于一个线程在操作共享数据过程中,未执行完毕的情况下,另外的线程参与进来,
导致共享数据存在了安全问题。
2.如何来解决线程的安全问题?
必须让一个线程操作共享数据完毕以后,其它线程才会有机会参与共享数据的操作。
3.java如何实现线程的安全问题:线程的同步机制
方式一:同步代码块
synchronized(同步监视器){
//需要被同步的代码块(即为操作共享数据的代码)
}
1.共享数据:多个线程共同操作的同一个数据(变量)
2.同步监视器:由一个类的对象来充当。那个线程获取此监视器,谁就执行大括号里被同步的代码
方式二:同步方法
将操作共享数据的方法声明为synchronized。即此方法为同步方法,能够保证当其中一个线程执行此方法时,其它线程 在外等待至此线程执行完此方法。
//模拟火车站售票窗口,开启三个窗口售票,总票数为100张
class Window1 implements Runnable {
	 int tinket = 100;

	public void run() {

		synchronized (this) {
			while (true) {
			
				if (tinket > 0) {
					System.out.println(Thread.currentThread().getName() + "售票,票号为" + tinket--);

				} else {
					break;
				}
			}
		}

	}

}

public class TestWindow1 {
	public static void main(String[] args) {
		Window1 w = new Window1();
		Thread t1= new Thread(w);
		Thread t2= new Thread(w);
		Thread t3= new Thread(w);
		
		t1.setName("窗口1");
		t2.setName("窗口2");
		t3.setName("窗口3");
		t1.start();
		t2.start();
		t3.start();
	}
}

//模拟火车站售票窗口,开启三个窗口售票,总票数为100张
class Window3 implements Runnable {
	int tinket = 100;

	public void run() {

		synchronized (this) {
			while (true) {
				show();
			}
		}

	}

	public synchronized void show() {

		if (tinket > 0) {
			try {
				Thread.currentThread().sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + "售票,票号为" + tinket--);

		}

	}

}

public class TestWindow2 {
	public static void main(String[] args) {
		Window3 w = new Window3();
		Thread t1 = new Thread(w);
		Thread t2 = new Thread(w);
		Thread t3 = new Thread(w);

		t1.setName("窗口1");
		t2.setName("窗口2");
		t3.setName("窗口3");
		t1.start();
		t2.start();
		t3.start();
	}
}

三、线程的分类

Java中的线程分为两类:一种是守护线程,一种是用户线程
1.它们在几乎每个方面都是相同的,唯一的区别就是潘丹JVM何时离开
2.守护线程是用来服务用户线程的,用过在start()方法前调用thread.setDaemon(true)可以吧一个
用户线程变成一个守护线程。
3.Java垃圾回收就是一个典型的守护线程。
4.若JVM中都是守护线程,当前JVM将退出。

四、线程的生命周期

JDK中用Thread.State枚举表示了线程的几种状态
--想要实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来
表示线程,在它的一个完成的生命周期中通常要经历如下的五种状态:
(1)新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态
(2)就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件
(3)运行:当就绪的线程被调度并画的处理器资源时,便进入运行状态,run()方法定义了线程的操作和功能
(4)堵塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻
塞状态
(5)死亡:线程完成了它的全部工作或线程被提前强制性的中止

五、线程的死锁问题

死锁
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,
了线程的死锁
解决方法
专门的算法、原则
尽量减少同步资源的定义

六、线程通信

wait()与notify()和notifyAll()
wait():令当前线程挂起并放弃CPU、同步资源,使别的线程可访问并修改共享资源,
而当前线程排队等候再次对资源访问
notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待
notifyAll():唤醒正在排队等待资源的所有线程结束等待。
Java.lang.Object提供的这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则
会报Java.lang.lllegalMonitorStateException异常

七、线程的优先级

线程的优先级控制
MAX_PRIORRITY(10);
MIN_PRIORRITY(1);
NORM_PRIORRITY(5);
涉及的方法:
getPriority():返回线程优先值
setPriority(int newPriotity):改变线程的优先级
线程创建时继承父线程的优先级




避坑指南:C#调用CodeSoft打印标签时常见的5个错误及解决方法 本文总结了C#调用CodeSoft打印标签时常见的5个核心错误及解决方案,涵盖环境配置、模板加载、变量赋值、打印机切换和资源管理。重点解析了如何避免COM对象创建失败、模板路径错误、变量名不匹配、打印机切换异常及内存泄漏等问题,帮助开发者实现稳定高效的标签打印集成。 阅读详情

相关推荐

linux下wayland协议修改键盘映射

linux下wayland协议,修改键盘映射,实验环境是Ubuntu24,其他wayland协议窗口应该也是可以的。

qq_15027967的博客 1068

Java多线程(超详解)

Java多线程(超详解)

m0_52896041的博客 1万+

全志T113-S3 Linux系统移植实战:从硬件配置到内核启动全解析

本文详细解析了将Linux系统移植到全志T113-S3嵌入式芯片的完整实战流程。内容涵盖从开发环境搭建、Longan SDK源码获取,到关键的U-Boot配置、DDR初始化、Linux内核编译与设备树定制,以及根文件系统构建与启动脚本分析。文章结合硬件配置与启动日志解读,提供了从硬件配置到内核启动的全方位指导,帮助开发者高效完成系统移植。

ik67890123的博客 517

出现IllegalMonitorStateException的各种情况以及wait(),notify(),notifyAll()的使用说明

IllegalMonitorStateException的各种情况,java 多线程的知识点, wait(),notify(),notifyAll()的使用说明

qq_64426102的博客 6159

麒麟V10 ARM环境离线部署MySQL:从依赖缺失到服务自启的完整避坑指南

本文详细介绍了在麒麟V10 ARM环境下离线部署MySQL的完整流程,包括依赖缺失解决方案、目录配置、服务自启设置及性能调优。特别针对国产操作系统和ARM架构的兼容性问题,提供了实用的避坑指南和优化建议,帮助用户高效完成MySQL部署与维护。

weixin_28741413的博客 409

CentOS 7/8 系统下,基于Docker Compose一键部署Dify AI应用平台

本文详细介绍了在CentOS 7/8系统下,使用Docker Compose一键部署Dify AI应用平台的完整流程。从系统环境准备、Docker引擎安装与加速配置,到获取Dify项目、关键环境变量设置,再到服务启动、状态监控及初始化访问,提供了手把手的部署指南和常见问题排查方法,帮助用户快速搭建稳定、可维护的AI应用开发环境。

q5r6s7的博客 139

java多线程(超详细)

进程就是正在运行中的程序(进程是驻留在内存中的)是系统执行资源分配和调度的独立单位每一进程都有属于自己的存储空间和系统资源注意:进程A和进程B的内存独立不共享。

zdl66的博客 10万+

elegant(ELEctron Generation ANd Tracking)入门指南(1)

elegant (ELEctron Generation ANd Tracking),美国先进光子源(APS)所用的圆环加速器的模拟程。

qq_41106132的博客 1848

IllegalMonitorStateException 异常例子的解决方法

IllegalMonitorStateException 异常解决方法

spring123tt的专栏 1万+

08-StarRocks性能调优FAQ

StarRocks性能调优摘要 本文提供了StarRocks数据库性能调优的常见问题解答,涵盖查询优化、索引设计、分区策略和系统配置等关键方面。主要内容包括:查询优化技巧(使用EXPLAIN分析、避免全表扫描、优化JOIN和聚合查询);索引选择与维护建议(高频查询列索引、复合索引);分区策略设计(时间分区、范围分区)及其管理方法;以及系统内存配置优化(JVM参数调整、查询内存限制设置)。这些优化措施可显著提升StarRocks的查询性能和系统效率。

欢迎来到我的博客,一起探索代码里的世界! 541

RK3588开发笔记-ISP模块参数调试

本文详细介绍了基于RK3588平台的ISP模块参数调试流程。主要内容包括:硬件准备(RK3588板卡、IMX415摄像头等)、软件环境搭建(Ubuntu系统、RKISP_Tuner工具)、IMX415摄像头基础使用验证、RKISP2.x Tuner工具的使用方法(新建/加载IQ参数文件、Sensor配置、Raw图采集)以及最终IQ文件的部署。文章重点强调了基础标定的重要性,建议开发者分场景调试并参考官方文档,通过合理配置ISP参数来优化图像质量。该调试流程适用于RK3588平台的图像采集类项目开发。

flypig has a dream! 839

Java多线程详解(一)Java多线程入门

最近听很多面试的小伙伴说,网上往往是一篇一篇的Java多线程的文章,除了书籍没有什么学习多线程的一系列文章。但是仅仅凭借一两篇文章很难对多线程有系统的学习,而且面试的时候多线程这方面的知识往往也是考察的重点,所以考虑之下决定写一系列关于Java多线程的文章。文章参考了高老师的《Java多线程编程核心技术》。力争使用最短的篇幅把Java多线程的知识作以系统的讲述。 本节思维导图: 思维导图...

刘成 2475

【功能安全】软件安全架构

目录01 软件安全架构介绍02 软件架构设计模板03 软件架构设计示例 软件架构设计的目的 软件架构设计的原则 软件架构设计输入与输出 软件架构设计的要求 注:软件架构设计和软件安全要求之间的双向可追溯性。软件架构设计原则: 软件架构静态/动态设计(参考秒尼科技术) 软件架构静态设计 软件架构动态设计 软件分层架构设计 软件架构设计安全机制错误探测的安全机制 其中:数据的范围检查指输入输出数据的范围进行检查,例如:在程序中我们可以通过数据范围来排除数据的正确性;合理性检查 例如:使用参

weixin_36460584的博客 514

【Java多线程】Java多线程技能

到 1. 进程和多线程的概念及线程的优点 提到多线程这个技术就不得不提及“进程”这个概念,在“百度百科”中对进程的解释如下: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 进程是受操作系统管理的基本运行单元。 那什么是线程呢? 线程可以理解成是在

一定要站在自己热爱的生活里闪闪发光 4万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java 多线程详解

多线程(Multithreading)是指在一个程序中同时执行多个线程的能力。线程是进程中的一个执行路径,多线程允许程序在同一时间内执行多个操作。Java 中的多线程可以通过并发处理来提高程序的性能和响应速度,尤其在处理复杂计算、大量 I/O 操作或并发任务时非常有用。多线程使得程序可以同时执行多个任务,充分利用CPU资源,提升程序性能,增强响应性,并简化程序的复杂度。尽管多线程编程带来了一些挑战,如线程安全和死锁问题,但合理设计和使用多线程可以显著改善程序的整体表现。

goTsHgo的博客 2040

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java技术——Java多线程学习

0.前言 转载请标明出处:http://blog.youkuaiyun.com/seu_calvin/article/details/52400927 学习多线程之前需要先了解以下几个概念。 进程:一般指一个程序运行时的实例,每个进程有自己独立的地址空间。一个进程无法直接访问另一个进程的数据。 线程:是CPU调度的最小单元,一个进程可以有很多线程,每条线程可以并行执行不同的任务。并且每个线程有独立的运...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java多线程

Java多进程,多线程编程,如何创建线程,线程启动中断等待,了解各种线程状态,线程安全以及如何解决线程安全问题,锁的作用,以及如何加锁,了解死锁怎么出现,如何解决死锁问题

Coding经历 1424

java多线程

在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程。操作系统调度的最小任务单位其实不是进程,而是线程。

m0_60301012的博客 775

Java多线程详解

线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

坏蛋阿土的博客 6820

java多线程是什么_Java多线程是什么

本篇文章将介绍一下多线程和其实例。Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程 序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线 程来运行。一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的Hello...

weixin_33050129的博客 379

JAVA多线程是什么

一、 什么是多线程: 我们现在所使用操作系统都是多任务操作系统(早期使用的DOS操作系统为单任务操作系统),多任务操作指在同一时刻可以同时做多件事(可以同时执行多个程序)。 多进程:每个程序都是一个进程,在操作系统中可以同时执行多个程序,多进程的目的是为了有效的使用CPU资源,每开一个进程系统要为该进程分配相关的系统资源(内存资源) 多线程:线程是进程内部比进程更小的执行单元(执行流|程序片段),每个线程完成一个任务,每个进程内部包含了多个线程每个线程做自己的事情,在进程中的所有线程共享该进程的资源; 主

qq_45022104的博客 4446

[java多线程][java] java多线程拼接字符串

前言: 看到一个java多线程拼接字符串的题,所以就来写一下。 题目描述 Java多线程 时间限制:C/C++语言 1000MS;其他语言 3000MS 内存限制:C/C++语言 65536KB;其他语言 589824KB 题目描述: 设计三个线程,三个线程并行执行,要求分别在控制台输入数据后面拼接"_A","_B","_C",并且需要保证线程1,线程2,线程3按顺序执行,即线程1执行完成后,再执...

qq_39397165的博客 1370
上一篇: Java枚举类&注解
sdecode
博客等级 码龄10年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值