JAVA_线程

万字详解YOLOv8网络结构Backbone/neck/head以及Conv、Bottleneck、C2f、SPPF、Detect等模块 YOLOv8是由Ultralytics开发的最先进的目标检测模型,推升了速度、准确性和用户友好性的界限。YOLO这一缩写代表“你只看一次”(You Only Look Once),通过在一次网络传递中同时预测所有边界框,提升了算法的效率和实时处理能力。相比之下,其他一些目标检测技术需要经过多个阶段或过程来完成检测。YOLOv8在流行的YOLOv5架构上进行了扩展,在多个方面提供了改进。 阅读详情

一、线程的基本概念

       在操作系统中两个比较容易混淆的概念是进程(process)和线程(thread)。操作系统中的进程是资源的组织单位。进程有一个包含了程序内容和数据的地址空间,以及其它的资源,包括打开的文件、子进程和信号处理器等。不同进程的地址空间是互相隔离的。而线程表示的是程序的执行流程,是CPU调度的基本单位。线程有自己的程序计数器、寄存器、栈和帧等。引入线程的动机在于操作系统中阻塞式I/O的存在。当一个线程所执行的I/O被阻塞的时候,同一进程中的其它线程可以使用CPU来进行计算。这样的话,就提高了应用的执行效率。线程的概念在主流的操作系统和编程语言中都得到了支持。
       一部分的Java程序是单线程的。程序的机器指令按照程序中给定的顺序依次执行。Java语言提供了java.lang.Thread类来为线程提供抽象。有两种方式创建一个新的线程:一种是继承java.lang.Thread类并覆写其中的run()方法,另外一种则是在创建java.lang.Thread类的对象的时候,在构造函数中提供一个实现了java.lang.Runnable接口的类的对象。在得到了java.lang.Thread类的对象之后,通过调用其start()方法就可以启动这个线程的执行。
       一个线程被创建成功并启动之后,可以处在不同的状态中。这个线程可能正在占用CPU时间运行;也可能处在就绪状态,等待被调度执行;还可能阻塞在某个资源或是事件上。多个就绪状态的线程会竞争CPU时间以获得被执行的机会,而CPU则采用某种算法来调度线程的执行。不同线程的运行顺序是不确定的,多线程程序中的逻辑不能依赖于CPU的调度算法。
  Windows操作系统是支持多线程的,它可以同时执行很多个线程,也支持多进程,因此Windows操作系统是支持多线程多进程的操作系统。Linux和Uinux也是支持多线程和多进程的操作系统。DOS就不是支持多线程和多进程了,它只支持单进程,在同一个时间点只能有一个进程在执行,这就叫单线程。
  CPU难道真的很神通广大,能够同时执行那么多程序吗?不是的,CPU的执行是这样的:CPU的速度很快,一秒钟可以算好几亿次,因此CPU把自己的时间分成一个个小时间片,我这个时间片执行你一会,下一个时间片执行他一会,再下一个时间片又执行其他人一会,虽然有几十个线程,但一样可以在很短的时间内把他们通通都执行一遍,但对我们人来说,CPU的执行速度太快了,因此看起来就像是在同时执行一样,但实际上在一个时间点上。
  那什么才是真正的多线程?如果你的机器是双CPU,或者是双核,这确确实实是多线程。

二、线程的创建和启动

  在JAVA里面,JAVA的线程是通过java.lang.Thread类来实现的,每一个Thread对象代表一个新的线程。创建一个新线程出来有两种方法:第一个是从Thread类继承,另一个是实现接口runnable。VM启动时会有一个由主方法(public static void main())所定义的线程,这个线程叫主线程。可以通过创建Thread的实例来创建新的线程。你只要new一个Thread对象,一个新的线程也就出现了。每个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。

Demo1:实现Runnable接口创建和启动新线程
package com.liangdianshui;

public class ThreadRunable {
	public static void main(String args[]) {
		MyRunable mRunable = new MyRunable();
		// r1.run();//这个称为方法调用,方法调用的执行是等run()方法执行完之后才会继续执行main()方法
		new Thread(mRunable).start();  //启动一个线程
		for (int i = 0; i < 10; i++) {
			System.out.println("main:" + i);
		}
	}
}

/**
 * 自定义一个类,实现Runable接口 打印1-10
 *
 */
class MyRunable implements Runnable {
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("MyRunable:" + i);
		}
	}
}
运行结果:

       在我的机子上运行的结果是这样,在你们的机子上运行的结果也可能不一样的!他的运行原理是这样的:


Demo2:继承Thread类,重run()方法创建和启动新的线程
package com.liangdianshui;

public class ThreadExtendThread {
	public static void main(String[] args) {
		MyThread mThread = new MyThread();
		mThread.start(); // 开启一个新的线程
		for (int i = 0; i < 10; i++) {
			System.out.println("main:" + i);
		}
	}
}

/**
 * 继承Thread
 *
 */
class MyThread extends Thread {
	@Override
	public void run() {
		super.run();
		for (int i = 0; i < 10; i++) {
			System.out.println("MyThread: " + i);
		}
	}
}

  使用实现Runnable接口和继承Thread类这两种开辟新线程的方法,在选择上:应该优先选择实现Runnable接口这种方式去开辟一个新的线程。因为接口的实现可以实现多个,而类的继承只能是单继承。因此在开辟新线程时能够使用Runnable接口就尽量不要使用从Thread类继承的方式来开辟新的线程。

       通过上面的例子,我们可以这样理解线程,主线程就是一个部门的主管,当遇到比较耗时的工作的时候,他可以安排部门的其他员工帮忙做,然后他自己继续做下面的事情,最后只要知道员工完成的结果就行了~!

三、线程状态转换
3.1.线程控制的基本方法
3.2. sleep/join/yield方法介绍

Demo:

package com.liangdianshui;

import java.util.Date;

public class ThreadRunable {
	public static void main(String args[]) {
		MyRunable mRunable = new MyRunable();
		// r1.run();//这个称为方法调用,方法调用的执行是等run()方法执行完之后才会继续执行main()方法
		new Thread(mRunable).start(); // 启动一个线程
		for (int i = 0; i < 10; i++) {
			System.out.println("main:" + i);
			if (i == 5) {
				try {
					System.out.println(new Date().toLocaleString());  //打印当前时间
					Thread.sleep(5000); // 让主线程休眠5秒
					System.out.println(new Date().toLocaleString());  //打印当前时间
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

/**
 * 自定义一个类,实现Runable接口 打印1-10
 *
 */
class MyRunable implements Runnable {
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("MyRunable:" + i);
		}
	}
}

运行结果:



Demo:

package com.liangdianshui;

import java.util.Date;

public class ThreadRunable {
	public static void main(String args[]) {
		MyRunable mRunable = new MyRunable();
		// r1.run();//这个称为方法调用,方法调用的执行是等run()方法执行完之后才会继续执行main()方法
		Thread mThread = new Thread(mRunable);
		mThread.start(); // 启动一个线程
		for (int i = 0; i < 10; i++) {
			System.out.println("main:" + i);
		}
		try {
			mThread.join();  //把子线程合并到主线程,等于是调用子线程的方法
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

/**
 * 自定义一个类,实现Runable接口 打印1-10
 *
 */
class MyRunable implements Runnable {
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("MyRunable:" + i);
			if (i == 2) {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
运行结果:

         


          join方法你可以理解为是直接停止了那个子线程,然后在主线程中继续运行!

Demo:
package com.liangdianshui;

import java.util.Date;

public class ThreadRunable {
	public static void main(String args[]) {
		MyThread1 t1 = new MyThread1("t1");
		MyThread1 t2 = new MyThread1("t2");
		t1.start();
		t2.start();
	}
}

class MyThread1 extends Thread {

	private String strName;

	public MyThread1(String str) {
		strName = str;
	}

	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(strName + ":" + i);
			try {
				Thread.sleep(1000); //为了更好的显示效果,增加延迟
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if (i % 2 == 0) {
				yield();
			}
		}
	}

}
四、线程的优先级别

五、线程同步


六、总结
        这篇博文首先简单的介绍了什么是进程和线程,知道单个CPU不是真正意义上的多进程,CPU把自己的时间分成一个个小时间片,我这个时间片执行你一会,下一个时间片执行他一会,加上CPU的运行速度很快,因此像同时运行多个程序一样,然后了解实现Thread的两种方法,一种是实现Runable接口,一种是继承Thread类,最后讲了线程的一些方法!

【以太网硬件六】1000base-T物理层编码究竟是怎么编的? 详述1000base-T物理层4D-PAM5的编码过程 阅读详情

相关推荐

四旋翼黑科技揭秘:如何利用PX4隐藏的角加速度数据提升控制性能

本文深入探讨了如何利用PX4飞控中隐藏的角加速度数据,结合增量非线性动态逆(INDI)控制方法,显著提升四旋翼无人机的控制性能。通过实战教程,指导开发者从数据订阅、INDI原理到代码实现,构建响应更快、鲁棒性更强的控制回路,有效应对突风与快速机动。

lake5的博客 719

Java框架介绍-13个不容错过的框架项目

Java框架介绍-13个不容错过的框架项目 本文转自互联网,个人收藏所用。 下面,我们将一同分享各有趣且颇为实用的Java库,大家请任取所需、不用客气~ 1.极致精简的Java Bootique是一项用于构建无容器可运行Java应用的极简技术。该项目允许大家创建REST服务、Web应用、任务、数据库迁移等等,且一切都立足于模块实现。...

weixin_34238642的博客 992

CSRT跟踪算法的使用

Fu Xianjun. All Rights Reserved. 文章目录 前言 一、CSRT跟踪算法是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、CSRT跟踪算法是什么? 在具有通道和空间可靠性的判别相关滤波器(DCF-CSR)中,我们使用空间可靠性图将滤波器支持调整为从帧中选择区.

sinat_53821602的博客 7903

分享一份GitHub上120K Stars国内第一的Java多线程PDF

随着CPU多核时代的到来,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案。然而,多线程编程相关的设计模式书籍多采用C++作为描述语言,且书中所举的例子多与应用开发人员的实际工作相去甚远。本书采用Java (JDK1.8) 语言和UML为描述语言,并结合作者多年工作经历的相关实战案例,介绍了多线程环境下常用设计模式的来龙去脉:各个设计模式是什么样的及其典型的实际应用场景、实际应用时需要注意的事项以及各个模式的可

Java圈全能架构师的博客 1377

倍福Beckhoff运动控制功能块实战解析:从MC_ReadActualPosition到MC_GearInVelo

本文深入解析倍福(Beckhoff)TwinCAT运动控制功能块,从基础的MC_ReadActualPosition、MC_Power等轴状态读取与使能操作,到MC_MoveAbsolute、MC_MoveRelative等单轴定位指令,并重点剖析了用于动态速度同步的核心功能块MC_GearInVelo在飞锯等场景的应用。文章结合实战经验,详细介绍了齿轮耦合、电子凸轮(MC_CamIn)等高级同步功能的参数配置、调试技巧及常见问题,旨在帮助工程师快速掌握倍福运动控制工具箱,实现复杂的同步工艺。

transformer2023的博客 981

XR Interaction Toolkit实战:为HTC Vive Cosmos打造抓取、投掷与UI交互(Unity 2023教程)

本文详细介绍了如何使用Unity 2023和XR Interaction Toolkit为HTC Vive Cosmos开发抓取、投掷与UI交互系统。通过实战案例'VR投掷训练室',从基础配置到高级功能实现,涵盖物理抓取、精准投掷机制和VR UI交互设计,帮助开发者提升VR交互开发技能。

weixin_30562507的博客 255

EasyDemo*Java多线程常见状态小练习(on Github)

点击打开链接

waynesong 360

数据中台之流程引擎:Activiti工作流引擎详解

一. 简介 BPM: BPM规范及BPM软件 BPMN: Activiti 7 1.工作流俩种方式 1.状态值跟踪法 1.工作流软件 2.工作流引擎对比 1.Activiti 2.JBPM5 3.flowable 4.liteflow 3.步骤 1.部署Activiti 1.流程定义 1.流程定义部署 1.启动流程实例 1.任务查询代办 1.用户办理任务 1.流程结束 二. 核心 Activiti 基础架构.png Activiti 7大接口.png RepositoryService:提供一系列管理流

GIS摆渡人 1687

JAVA线程

虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock,Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化。

互联网底层民工的博客 1万+

基于FPGA的多通道音频信号采样系统设计

FPGA是随着数字集成电路的发展而逐步演变而来的。从早期的电子管、晶体管、小规模集成电路,到超大规模集成电路(VLSIC),数字集成电路的集成度和性能不断提升。FPGA的出现为系统设计师提供了灵活的设计平台,使其能够在不依赖半导体厂商的情况下快速设计专用集成电路(ASIC)。FPGA具有设计周期短、成本低、开发工具先进等优点,广泛应用于原型设计和产品生产中。VHDL是一种用于描述数字系统的硬件描述语言,其语言形式类似于计算机高级语言,但包含了许多硬件特征语句。

qq_62634009的博客 709

基于YOLOv8和时序模型的异常动作检测系统

异常动作检测是计算机视觉领域的重要应用,广泛应用于智能监控、安防系统、老人看护等场景。本项目结合YOLOv8目标检测和LSTM时序模型,实现对打架、摔倒、奔跑等异常动作的实时检测,并提供了完整的Web界面。多技术融合: 结合YOLOv8目标检测和LSTM时序建模实时检测: 支持实时视频流处理和文件分析用户友好: 提供完整的Web界面可扩展性: 模块化设计便于功能扩展高性能: 包含多种优化策略。

YOLO 763

【线程】Java线程操作

讲述了线程的启动、终止、等待操作,还有线程的各种状态。

telasi2004的博客 2063

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

1、【java线程及线程池系列】java线程及线程池概念详解

缓冲队列长度的设置,按照一般的理解应该设置成maximumPoolSize的5倍,因为单个线程在不切换cpu的情况下是单个cpu运算一个线程,corePoolSize设置成和cpu一样的数量,maximumPoolSize设置成cpu的2倍,避免cpu处于空闲状态则直接加入一旦cpu空闲理解执行的线程数量,同时由于cpu的速度较快以及有请求执行的线程加入缓冲队列中减少cpu等待时间,故将缓冲队列设置大一些。线程池存在的目的在于提前创建好需要的线程,减少临时创建线程带来的资源消耗。

alanchanchn的专栏 8万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java线程:什么是线程

一 基本概念   多任务:同一时刻运行多个程序的能力。每一个任务称为一个线程。可以同时运行一个以上线程的程序称为多线程程序。   Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线

arredando的博客 3万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java创建线程

既然说到线程,在这里就给大家普及一下线程。 线程(Thread): 是操作系统能够进行运算调度的最小单位。 它被包含在进程之中,是进程中的实际运作单位。 一个线程指的是进程中一个单一顺序的控制流。 🥂🥂🥂 其实:进程在我们计算机中我们随时都在使用:按住 Ctrl + shift + esc 这个就是一个进程,在计算机中,线程就是进程中的一个执行单元。 那么,进程是什么呢? 进程:简简单单,我们日常中使用的QQ就是一个进程,进程可以理解为就是一个软件,线程则就是这个软件中的一些功

分享it知识! 7911

JAVA线程、线程池解析

是操作系统能够进行的最小单位,它被包含在进程之中,是进程中的实际运作单位。进程是资源分配的基本单位,它拥有自己独立的地址空间和各种资源;而线程是处理机调度的基本单位,它只能和其他线程共享进程的资源,而。线程的上下文切换速度比进程快。

柔丽君的博客 1413

Java多线程——认识线程

Java多线程初阶—— 认识线程

YumunaoDAII的博客 1631

Java线程与内核线程

本篇文章探究下Java线程与内核线程的关系. 在Java中,一个Java的线程对应一个内核的线程,实际的业务代码是由内核线程来执行的,而Java线程只是一个傀儡. 先通过一个简单的实验热热身 import java.lang.Thread; public class Example { public static void main(String[] args) throws Exception { new Thread(new Runnable() { @O

书唐瑞的博客 975

Java线程,多线程,线程同步,以及Java回调线程,还有难懂的synchronized

曾几何时,有多少人听到了多线程就某花一紧,听到了线程的同步就感觉昏昏欲睡。那我们今天就聊一聊我的理解。线程是什么?Java中常用到的新建线程的场景?以及多线程和线程池的概念,最牛逼的还是要说清楚线程的同步。我跟人认为在Java的线程开发中,如果没有搞清楚同步的使用和JVM到底是什么机制实现的同步(本文中只针对synchronized的同步做讲解lock另写)。 废话不多说了,什么是线程这个问题大

Kyunchen的专栏 4485

Java 线程机制

Java 的线程机制是 Java 平台的核心特性之一,它允许程序同时执行多个任务。下面我将详细介绍 Java 线程的基本概念、创建方法、生命周期以及同步机制。

weixin_47363690的博客 1876

Java笔记——java 线程详解_java线程

此时就用这三个方法来灵活控制。并且jdk官方人员发现,很多线程在等待锁的时候,在很短的一段时间就获得了锁,所以它们在线程等待的时候,并不需要把线程挂起,而是让他无目的的循环,一般设置10次。例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完毕后,低优先级的线程才能够执行;thread.join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。

a25847a的博客 1341

java线程池停止线程_如何在Java中停止线程?

java线程池停止线程 停止线程 (Stopping a thread) As we know that there are no direct or shortcut ways to stop thread in Java. 众所周知,在Java中没有直接或快捷的方式来停止线程。 As we know thread in java stops when the execution of run...

cumtb2009的博客 5814

JAVA线程详解

目录 线程简介 线程实现 JAVA线程调度 JAVA线程的状态 JAVA新建线程 JAVA线程Thread类 AVA线程属性 线程安全 线程简介 操作系统运行一个程序时,会为其创建一个进程,一个进程里可以创建多个线程,线程为操作系统调度的最小单位,每个线程拥有各自的计数器、堆栈、、局部变量等属性,并且可以访问共享变量,CPU在这些线程上高速切换调度执行,早期CPU由单核实现,同...

qq_18581221的博客 7407

Java线程实现和线程状态

写在最前 之前写了ConcurrentHashMap,无论是1.8还是1.7,其中都会涉及锁Synchronized和ReentrantLock;锁的概念是为了解决线程安全问题;所以还是从线程开始写起。 这篇文章主要是写写Java线程的实现和线程的状态,以及上下文的概念,也有一些不完善的地方,会持续查缺补漏。 Java线程的实现 Java线程模型是基于操作系统原生线程模型的实现,在JDK中,win...

diaog的博客 1429

Java线程

线程(Thread)是操作系统调度的最小单元。每个进程至少有一个主线程,Java 程序本身就是多线程运行的。Java 中线程是轻量级的进程,多个线程共享同一个进程的资源(如堆内存),但拥有自己的栈空间。

m0_46168903的博客 1378

java线程

进程是程序的一次动态执行过程

J20230301的博客 999
上一篇: JAVA_网络编程
下一篇: Android_异步加载1
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值