java多线程及其相关知识点



 在说线程原理前,我得先介绍一下到底什么是线程,简单的来说,线程就是不同的两件事,大家都知道现在的操作系统是多任务操作系统,但是它是如何实现多任务的呢,多线程便是它实现多任务的手段之一。那么什么又是进程?这个更容易理解了,每一个应用程序都是一个由一个或多个进程组成的,打开你电脑的任务管理看看就会十分清楚的看到很多个进程在进行着,好了,废话不多说了,进入主题吧。

首先,Java中创建线程的有两种方法,第一种是创建一个类来继承Thread类,那么每个该类的对象都是一个线程了,只要在必要的地方创建对象调用start方法即可启动线程,线程有什么用呢?学过java的人都知道,一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程,同一个线程内程序的运行是从代码的上到下运行的,是一步步执行的。试想一下如果移动公司让你来编写一个查找用户的系统,假如你的程序只有一个主线程,那么得到猴年马月才能查找出一个用户啊(你得知道,移动的用户可是有几个亿那么多啊,大哥)?呵呵,这就得用多线程来解决啦,只要你启动N个线程来分段查找,那么需要的时间必然是大大减少的,仅仅知道了多线程的好处是不行的,还得掌握它才行,

大道理说了这么多,下面看看一个简单的线程例子吧!

//创建一个线程类,让它继承Thread
public class Mythread extends Thread {
	private int ID;// 用于线程的标志

	public Mythread(int ID) {
		this.ID = ID;
	}

	// 重写Thread中的run方法
	public void run() {
		int count = 0;
		while (true) {
			count++;
			System.out.println(ID+"线程输出的第" + count + "个数据");
			try {
				// 让线程休息1秒,否占用CUP过高
				Thread.sleep(1000);
			} catch (Exception ef) {
				ef.printStackTrace();
			}
		}

	}

}

 

 

public class StartThread {

	public static void main(String[] args) {
		// 启动五个线程
		for (int i = 0; i < 5; i++) {
			Mythread thread = new Mythread(i);
			thread.start();
		}

		// 创建线程对象的另外一种方法,通过匿名内部类实现Runnable接口来创建
		java.lang.Runnable run = new java.lang.Runnable() {

			public void run() {
				int count = 0;
				while (true) {
					count++;
					System.out.println("Runnable线程输出" + count);

					try {
						Thread.sleep(1000);
					} catch (Exception ef) {
						ef.printStackTrace();
					}
				}

			}

		};
		//创建线程
		Thread th=new Thread(run);
		//启动线程
		th.start();

	}

}

 

运行程序,可以看到输出的结果为:

0线程输出的第1个数据

1线程输出的第1个数据

2线程输出的第1个数据

4线程输出的第1个数据

3线程输出的第1个数据

Runnable线程输出1

0线程输出的第2个数据

1线程输出的第2个数据

2线程输出的第2个数据

3线程输出的第2个数据

4线程输出的第2个数据

Runnable线程输出2

1线程输出的第3个数据

2线程输出的第3个数据

0线程输出的第3个数据

3线程输出的第3个数据

4线程输出的第3个数据

细心的你或许会发现,线程前面的编号不每次打印的顺序都一样的,这就涉及到了线程的同步啦,再说这个前,先说一下线程的几种状态,其结构图(此图是COPY过来的,呵呵)如下:

 

 

 在这里对图解释一下:

 1、当我们new了这个对象后,线程就进入了初始状态;

 2、当该对象调用了start()方法,就进入可运行状态;

 3、进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行; 

 4、进入运行状态后情况就比较复杂了

    4.1、run()方法或main()方法结束后,线程就进入终止状态;

    4.2、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片

    4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;

   4.4、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;

   4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。

何谓多线程同步?因为多线程给你提了程序的异步执行的功能,所以在必要时必须还提一种同步机制。例如,你想两个线程通讯并共享一个复杂 的数据结构,你需要一种机制让他们相互牵制并正确执行,这就像生产者/消费者机制一样,为这个目的,Java用一种叫监视器(monitor)的机制实现了进程间的异步执行。可以将监视器看作是一个很小的盒子,它只能容纳一个线程。一个线程进入一个监视器,所有其他线程必须等到第一个线程退出监视器后才能进入;监视器可以设计成保护共享的数据不被多个线程同时操 作。大多数多线程系统将监视器设计成对象,Java提了一种更清晰的解决 方案。没有Monitor类;每个对象通过将他们的成员函数定义synchronized来定义自己的显式监视器,一 个线程执行在一个synchronized函数 里, 其他任何线程都不能调用同一个对象的synchronized函 数。

以上有自己的思想,也有从别人那得来的,呵呵···

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Java-多线程知识点 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。进程是资源分配的最小单位线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。线程是cpu调度的最小单位线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 阅读详情

相关推荐

Java多线程--多线程知识点总结和企业真题

Java多线程--多线程知识点总结和企业真题

人生得意须尽欢 1323

java高并发编程(多线程详解) - 学习目录

java高并发编程(多线程详解-学习目录)前言目录 前言 对于我自己而言,通过一个完整学习体系去学习新的东西是很有必要的,在很多的时候是有事半功倍的效果。对于多线程高并发而言我的学习路径主要是通过看书百度(后期可能会订阅一部分网络课程)去学习,在学习这些知识的时候总会因为其他的知识点不了解二不能串联起来,所以写了这个主题为多线程的专题博客,其目的是以文章的形势整理一篇别人能够看懂的知识文章,只有能...

qq_35866165的博客 449

文档多模态识别工具对比:MinerU、PaddleOCR、Marker

本文对比了三款文档多模态识别工具:MinerU、PaddleOCR和Marker。MinerU专注于中文文档的端到端解析,支持复杂元素提取和结构化输出,适合中文论文和教材解析。PaddleOCR是通用OCR工具包,支持多语言和全流程任务,适用于发票、车牌等图像OCR。Marker则注重多语言支持和轻量化部署,适合英文论文和技术文档的快速转换。三者在核心技术、中文优化、表格处理、输出格式、部署复杂度和适用语言等方面各有优劣。选型建议根据具体需求:MinerU适合高精度中文解析,PaddleOCR适合定制化OC

朴拙科技的博客 4746

Java面试题-Java多线程

Java面试题 Java多线程 1.进程与线程的区别是什么。 1.进程是程序在处理机上一次调度的过程,是动态的概念。 线程是进程的一个实体。 2.进程是资源分配和系统调度的基本单位。 线程是cpu调度的基本单位。 3.一个进程至少包含一个线程。线程的上下文切换速度要比进程快得多。 2.单线程与多线程是什么关系。 1.多线程是指在一个进程中,并发执行了多个线程, 每个线程都实现了不同的功能 2.在单核CPU中,将CPU分为很小的时间片, 在每一时刻只能有一个线程在执行,是一种微观上轮流占用C

Chinese_best的博客 925

实战指南:在UE5中高效集成Entt(ECS)框架

本文提供了一份在虚幻引擎5中高效集成Entt ECS框架的实战指南。针对UE5项目在处理大规模动态实体时的性能瓶颈,详细讲解了如何通过数据驱动的ECS架构进行优化。内容包括前期环境准备、核心构建步骤、创建首个ECS子系统以及与UE原生系统的数据同步技巧,旨在帮助开发者快速掌握集成方法,提升游戏逻辑的执行效率。

weixin_29002209的博客 158

计算机毕业设计springboot基于微信平台的二次元手办商场小程序【附源码】

选题背景: 随着二次元文化的兴起和普及,越来越多的人开始对二次元角色产生了浓厚的兴趣和喜爱。手办作为二次元文化的重要载体之一,成为了许多二次元爱好者收藏和展示的对象。然而,在传统的线下手办商场中,消费者往往面临着时间、空间和选择的限制。因此,基于微信平台的二次元手办商场小程序应运而生。 选题意义: 首先,基于微信平台的二次元手办商场小程序能够打破地域限制,使得用户可以随时随地通过手机进行购物。无论是在家中、上班途中还是旅行中,用户都能够方便地浏览和购买自己喜欢的手办,极大地提高了购物的便利性和灵活性。

拉期程序 452

一线大厂必备知识点梳理

日常学习笔记已学习知识点待学习知识点2021.2.1 阿里一面问题反思阿里2021.2.23线程题算法题 已学习知识点 待学习知识点 java 注解:定义、解决什么问题、常用注解、元注解、自定义注解、注解运行原理、使用场景及案例 Java泛型:定义、解决什么问题、使用场景、案例 NIO:定义、与传统IO比较、IO模型(五种)、非阻塞IO/IO复用什么情况 反射和动态代理:定义、解决什么问题、使用场景及案例、cglib和jdk自带动态代理区别 多线程基础:进程和线程区别、如何解决线程安全问题、死锁及避免死锁

撒忆雨 203

ESP32-CAM搭建Arduino及简单使用

配置环境 方法一 文件 → 首选项 http://wechat.doit.am/package_esp8266com_index.json https://dl.espressif.com/dl/package_esp32_index.json 工具 → 开发板 → 开发板管理器 等待安装 方法二 https://github.com/espressif/arduino-esp32 Arduino安装目录下,找到hardware文件夹 建立文件夹espressif,然后在里面再建立一个esp32文件夹

Ying的博客 2万+

JAVA多线程之volatile 与 synchronized 的比较

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。Mybatis面试专题MySQL面试专题并发编程面试专题《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!家展示一部分。

2401_83916241的博客 600

华为硬件工程师笔试题

1、基尔霍夫定理的内容是什么?(仕兰微电子)   基尔霍夫定理包括电流定律和电压定律。   电流定律(KCL):在集总电路中,任何时刻,对任一结点,所有流出结点的支路电流的代数和恒等于零。   电压定律(KVL):在集总电路中,任何时刻,沿任一回路,所有支路电压的代数和恒等于零。   2、平板电容公式(C=εS/4πkd)。(未知)   3、最基本的如三极管曲线特性。(未知)   4、描述反馈电路...

weixin_33717117的博客 2万+

YOLOv12改进策略【Neck】| arXiv 2024 MAFPN:多分支辅助特征金字塔网络 | 通过双向辅助融合与异构卷积机制,解决传统PAFPN多尺度特征融合不充分与小目标检测不足问题

本文记录的是利用MAFPN颈部结构改进YOLOv12的目标检测网络模型。通过引入双向辅助融合机制优化特征处理流程,在自底向上路径利用 SAF 模块融合主干浅层特征与颈部输出,并保留浅层空间信息,为小目标检测提供更丰富细节;自顶向下路径通过 AAF 模块建立密集连接,聚合浅层高 / 低分辨率层、同级层及前层特征,均衡各层通道数后实现多向梯度信息交互,增强中 / 大目标特征表达。将其应用到中,解决传统特征金字塔在多尺度信息整合中的不足,提升多尺度目标检测的精度与特征表达的丰富性。Multi-Branch Aux

Limiiiing的博客 1258

Java多线程 12 剩下的一些特性

有关Java多线程的主要内容都差不多完了,还有一些特别的方法和属性: package thread; /* join() 当A线程执行到了B线程的 join() 方法时,A就会等待。等B线程都执行完,A才会执行。 join可以用来临时加入线程执行。 如在 a 线程处调用 b.join(),这个方法影响的线程只有 a 和 b 两个 toString() 官方解释: 返回该线程的字符

窗边的倒影 905

YOLOv11改进策略【模型轻量化】| 使用 MoblieOne 模块,引入结构重参数化,提高模型检测效率

本文记录的是基于MobileOne的YOLOv11骨干网络改进方法研究。MobileOne的基础模块通过重参数化,。在将其替换YOLOv11的骨干网络后,实现模型轻量化。

Limiiiing的博客 1427

JAVA多线程面试题(一)

进程和线程的区别一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。多线程编程的好处是什么?在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源

请叫我搞向 586

如何使用Python爬取并保存网页上的所有附件

爬虫(Crawler)是一种自动化程序,它通过模拟人工访问网页并下载网页上的数据或文件,常用于数据采集和分析。爬虫通常以“爬取”的形式自动浏览和提取网页中的各种信息。本文详细介绍了如何使用Python爬取并保存网页中的附件文件,涵盖了网页解析、文件下载、多线程与异步优化等内容。希望通过本文的讲解,能够帮助你理解并掌握附件爬取的技巧。在实际应用中,爬虫开发不仅需要解决技术问题,还要遵守网络道德和法律法规,避免不当使用爬虫造成负面影响。

2201_76125261的博客 968

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

多线程面试题

什么是多线程? 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在...

weixin_30786657的博客 124

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JAVA面试题整理

最近看到网上流传着,各种面试经验及面试题,往往都是一大堆技术题目贴上去,而没有答案。不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型的Java面试中,...

总有些事,值得你去努力 536

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

多线程知识记录

1,什么是进程,什么是线程?    进程是正在进行中应用的程序,是程序在计算机上的一次执行活动,其实就是该应用程序在内存中分配的空间。 进程与线程的区别(转自http://www.cnblogs.com/hazir/archive/2011/05/09/2447287.html) 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位

Wang__Yan的博客 421

JAVA相关面试题集合

线程与进进程60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?答:有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果

何蘭萍的专栏 1258

多线程作业

多线程作业 一、 填空题 处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入___阻塞______状态。 处于新建状态的线程被启动后,将进入线程队列排队等待CPU,此时它已具备了运行条件,一旦轮到享用CPU资源就可以获得执行机会。上述线程是处于 就绪 状态。 一个正在执行的线...

weixin_30284355的博客 735

Java面试题 (模块三 :多线程 )

目录Java面试题 (模块三 :多线程 )35、并行和并发有什么区别?36、线程和进程的区别?37、守护线程是什么?38、创建线程有哪些方式?39、说一下 runnable 和 callable 有什么区别?40、线程有哪些状态?41、sleep()和 wait()有什么区别?42、notify() 和 notifyAll() 有什么区别?43、线程的run()和 start()有什么区别?44、 创建线程池有哪几种方式?45、 线程池都有哪些状态?46、线程池中 submit()和 execute()方法

weixin_46822367的博客 314

JAVA理论知识点总结

被abstract修饰的类是抽象类,抽象类不能被实例化,但可以继承,也可以被继承 void 是修饰方法的,没有返回值;finnal是修饰常量的;protected是保护的;static是静止的 try{} catch {} finnal{} try catch 直接处理异常 throw将异常抛给上一级 Integer类型在-128->127范围内是被缓存了,范围内相同数字内存地址相同(不会创建新对象,直接从缓存中取) java关键字都是小写 内存泄漏的概念,内存泄漏就是对象引用消失了,...

feifancaicai的博客 311

java多线程相关的知识点

Java 多线程涉及的知识点非常广泛,包括线程创建、同步、通信、线程池、并发工具类等。掌握这些知识点可以帮助你编写高效、安全的并发程序。在实际开发中,建议优先使用线程池和并发工具类,避免直接操作线程。

u012917290的博客 997

多线程相关知识点系统整理

摘要: 本文系统梳理了多线程编程的核心知识点。首先介绍了程序、进程、线程的基本概念及区别,阐述了单核与多核CPU的执行方式。详细讲解了三种线程创建方法:继承Thread类、实现Runnable接口和实现Callable接口,并比较了它们的优缺点。重点说明了线程特性、共享资源处理、同步机制及常用工具类(如CountDownLatch)。此外,还介绍了Lambda表达式简化线程创建的方法和常用Lombok注解。全文涵盖了从基础概念到高级特性的完整知识体系,为开发者提供了全面的多线程编程参考。

林冬的博客 713

多线程的相关知识点

一、什么是线程,理解线程和进程的关系 线程理解:影分身 线程是进程里面的一条执行路径,每个线程同享进程里面的内存空间和系统资源 一个进程 -- 多线程:各个线程都有不同的分工 进程:进程之间的内存空间和系统资源是独立的 线程:线程之间是共享内存空间和系统资源的 进程里:可以有一条或一条以上的线程 进程里只有一条线程的情况下,这条线程就叫做主线程 进程里有多条线程

z90708833_yp的博客 276

多线程相关知识点

多线程知识点总结 1.进程与线程 1.1什么是进程 程序是静止的,只有真正运行时的程序,才被称之为进程。 单核CPU在任何时间点上,只能运行一个进程:宏观并行,微观串行。 1.2什么是线程 线程,又称轻量级进程(Light Weight Process)。程序中的一个顺序控制流程,同时也是CPU调度的基本单位。进程由多个线程组成,彼此间完成不同的工作,交替执行,成为多线程。 迅雷是一个进程,当中的多个下载任务即是多个线程。 Java虚拟机是一个进程,当中默认包含主线程(Main),可通过代

weixin_48304192的博客 398
上一篇: web服务器工作原理及http协议通信
下一篇: Java程序如何优化??
Champion_netjava
博客等级 码龄16年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值