线程(多线程)基础

进程与线程

        多线程顾名思义就是多个线程,我们在了解线程之前就必须要知道什么是进程,要了解什么是进程我们就要知道什么是程序。

程序

        程序是包含有计算机指令和数据的文件,被存储在磁盘或其他的数据存储设备中,可以理解为程序是包含静态代码的文件,是一个文件集合。例如:浏览器软件、音乐播放器软件等软件的安装目录和文件。

进程

        进程是程序的一次执行过程,是系统运行程序的基本单位,是计算机分配资源的最小单位。在Windows 系统中,每一个正在执行的 exe 文件或后台服务,都是一个进程,由操作系统统一管理并分配资源,因此进程是动态的。例如:正在运行中的浏览器就是一个进程,你打开的QQ也是一个进程。一个程序可以同时打开多个进程,如:你可以同时登陆多个QQ进行聊天等。
        操作系统运行一个程序,就是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU时间,内存空间,文件,输入输出设备的使用权等。

线程

        线程是一个比进程更小的执行单位(CPU的最小执行单位)。一个进程在其执行的过程中可以产生多个线程。与进程不同的是,同类的多个线程共享同一块内存空间和一组系统资源(也就是一个进程里的线程共享这个进程所分配到的资源),所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多。

        某些进程内部还需要同时执行多个子任务。例如,我们在使用QQ发消息时,我们在发送消息的同时也会接受信息,同时还可以在后台进行文件下载和上传,我们把子任务称为线程。线程是进程划分成的更小的运行单位。

        进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个主线程,   每个线程都是一个独立的执行单位

进程 & 线程的区别

        根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位;
        资源开销:每个进程都有独立的代码副本和数据空间,进程之间的切换,资源开销较大;线程可以看做轻量级的进程,每个线程都有自己独立的运行栈和程序计数器,线程之间切换,资源开销小;
        包含关系:一个进程内包含有多个线程,在执行过程,线程的执行不是线性串行的,而是多条线程并行共同完成;
        内存分配:同一进程内的所有线程共享本进程的内存空间和资源;进程之间的内存空间和资源相互独立;
        影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响;一个线程崩溃,会导致整个进程退出。所以多进程要比多线程健壮;
        执行过程:每个独立的进程有程序运行的入口和程序出口。但是线程不能独立执行,必须依存在应用程序(进程)中,由应用程序提供多个线程执行控制;

JVM 进程

JVM进程的内存区域分配

        JVM 进程启动时,自动创建 Heap (堆区)和 Metaspace (元空间,JDK1.8 以前叫 Method Area 方法区);
        多个线程共享 JVM 进程的 Heap (堆区)和 Metaspace (元空间)资源,但每个线程有自己的程序计数器虚拟机栈本地方法栈。系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,因此,线程也被称为轻量级进程。

JVM进程由哪些线程组成

public static void main(String[] args) {
		//获取 Java 线程管理对象 ThreadMXBean
		ThreadMXBean threadMXBean = ManagementFactory. getThreadMXBean();

		//不需要获取的锁监视器 lockedMonitor 和 synchronizer 信息
		// 仅获取线程和线程信息
		ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);

		//遍历线程信息,仅打印线程 ID 和线程名称信息
		for (ThreadInfo threadInfo : threadInfos) {
		System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());

		}

输出结果

[6] Monitor Ctrl-Break         idea工具独有线程(run模式)

[5] Attach Listener         添加事件监听器

[4] Signal Dispatcher         分发处理给 JVM 信号的线程

[3] Finalizer         调用对象 finalize 方法的线程

[2] Reference Handler         清除 reference 线程

[1] main         主线程

线程的基本概念

单线程

        单线程就是进程中只有一个线程。单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。

        main 就是一个主线程,执行的时候按顺序从上往下执行

public class xx {
	public static void main(String[] args) {
		for (int i = 1; i <= 10; i++) {
			System.out.print(Thread.currentThread().getName() + ":" + i + "  ");
		}
		System.out.println();
        for (int i = 11; i <= 15; i++) {
			System.out.print(Thread.currentThread().getName() + ":" + i + "  ");
		}
	}
}

多线程

        由一个以上的线程组成的程序称为多线程程序。Java中,一定是从主线程开始执行
(main方法),然后在主线程的某个位置创建并启动新的线程。

多线程 & cpu

        多线程与CPU的关系是理解并发编程和系统性能的关键。以下是多线程与CPU相互作用的几个方面:

1. CPU核心与线程

        单核CPU:在单核处理器上,多线程是通过时间分片(time slicing)来实现的,操作系统快速在多个线程之间切换,给人一种同时进行的错觉。只能实现线程串行

        多核CPU:多核处理器可以真正并行地执行多个线程。每个核心可以运行一个线程,因此,一个四核处理器可以同时运行四个线程。

2. CPU调度

        线程调度:CPU的调度器负责决定哪个线程将在哪个核心上运行。调度策略可能基于线程优先级、CPU负载等因素。
        负载均衡:在多核系统中,操作系统尝试平衡各个核心上的负载,以最大化性能和效率。

 3. 并行处理

        并行线程:在多核CPU上,线程可以并行执行,这对于计算密集型任务(如视频编码、科学模拟)特别有益。
        线程亲和性:有时,为了减少缓存失效和提高性能,可以将特定线程绑定到特定核心。

线程的创建与启动

        通过创建 Thread 实例,完成线程的创建。 线程的内部实现可以通过继承 Thread 类、实现 Runnable 接口等方式进行封装。
        通过调用 Thread 实例的 start() 方法启动新线程。
        查看 Thread 类的源代码,会看到start()方法内部调用了一个 private native void start0()方法,native 修饰符表示这个方法是由 JVM虚拟机内部的C 代码实现的本地方法,由 JVM根据当前操作系统进行本地实现。



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值