Java线程与进程

简介: Java线程与进程

线程

概念

Java中,线程是程序执行的最小单位,它是进程的一个执行流,也是CPU调度和分配的基本单位。每个进程都可以运行多个线程,这些线程共享进程的内存块,但每个线程都有自己的堆栈和局部变量。

Java中的线程有两种类型:用户线程和守护线程。用户线程是程序的主要执行部分,而守护线程则是在后台运行的线程,用于执行一些支持性的任务,如垃圾回收。当所有用户线程都结束时,守护线程也会随JVM一起退出。

创建线程

一般创建线程有两种方式:

继承java.lang.Thread类并重写run方法。这种方式下,直接创建一个Thread类的子类,并重写其run方法。在run方法中编写线程要执行的代码。然后,创建一个该子类的实例,并调用其start方法来启动线程。需要注意的是,不能直接调用run方法,否则只是在普通的方法调用中执行了线程

代码,而没有启动新的线程。

实现java.lang.Runnable接口并重写run方法。这种方式下,我们创建一个实现了Runnable接口的类,并重写其run方法。然后,创建一个Thread类的实例,并将该Runnable对象作为参数传递给Thread类的构造函数。最后再调用Thread对象的start方法来启动线程。

public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // 启动线程
        
        new Thread(new MyRunnable()).start(); // 创建并启动线程
    }
}
// 法一
class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的代码
        System.out.println("MyThread is running!");
    }
}
// 法二
class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程执行的代码  
        System.out.println("MyRunnable is running!");
    }
}

image.gif

单线程与多线程

单线程指的是程序在执行过程中,按照连续的顺序执行代码,前面的任务必须完成后,后面的任务才会开始执行。单线程的执行方式相对简单,系统稳定性较高,扩展性强,软件资源丰富,多用于点对点的服务。例如,当处理时间短或者启动频率高的服务时,通常使用单线程。

比如我们刚刚只启动了一个线程输出到控制台;

多线程则是指从软件或硬件上实现多个线程并发执行的技术。多线程程序能够将工作拆分到多个软件线程,这些线程可以由不同的CPU内核并行处理,从而提高整体处理性能。当程序包含复杂的计算任务,或者需要处理速度较慢的外围设备(如打印或网络操作)时,通常会使用多线程。此外,当程序需要同时完成多项任务,或者需要提高程序的响应速度时,也会使用多线程。

比如一个网站同时有100个人浏览,那么服务器就要启动多线程来运行,使得每个用户不需要等待。如果这里还是用单线程,那么必然导致有人会等前边的人访问完才能访问,所以要使用多线程,让每个用户的线程都基本无需等待就能访问到。

进程

进程(Process)是操作系统进行资源分配和调度的基本单位,它是程序的一次执行过程。一个进程包含一个运行中的程序及其数据、系统资源和线程等。进程和程序的区别在于,程序是一组静态的指令集合,而进程是程序的一次动态执行过程。进程具有动态性、并发性、独立性和结构性的特点。

例如打开QQ程序,QQ就是一个进程,QQ进程中可以有多个线程。

下图中我们看到有4个名为QQ.exe的进程,但是下面的线程窗口(Thread)中与QQ.exe相关的不止4个

image.gif 编辑

线程与进程的区别

线程与进程的主要区别:

资源拥有:进程是拥有资源的一个独立单位,系统会给进程分配独立的内存空间和其他资源,如文件句柄、网络连接等。而线程是进程的一部分,它共享进程所拥有的资源,包括内存空间、文件句柄等。因此,线程之间共享数据变得更容易,但同时也需要注意同步和互斥问题。

执行方式:每个进程都有自己独立的执行环境和执行序列,系统通过进程切换来实现不同进程之间的并发执行。而线程是进程中的执行单元,多个线程共享同一个进程的地址空间,线程之间通过共享进程的资源来实现并发执行。线程的执行是由进程来启动和管理的,每个线程都有一个线程ID、程序计数器、寄存器集合和栈等执行上下文。

系统开销:由于进程拥有独立的资源,因此在创建、切换和销毁进程时,系统需要分配和回收大量的资源,开销较大。而线程共享进程的资源,创建、切换和销毁线程的开销相对较小,因此更适合用于实现大量的并发执行。

安全性:进程是独立的执行环境,一个进程出现问题不会影响其他进程的执行,因此多进程程序更加安全、生命力更强。但是,线程之间的共享数据可能会导致同步和互斥问题,如果处理不当,可能会出现数据不一致、死锁等问题,因此多线程程序需要更加小心地设计和实现。

目录
相关文章
|
9天前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
9天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
120 60
【Java并发】【线程池】带你从0-1入门线程池
|
5天前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
51 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
21天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
87 14
|
24天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
53 13
|
24天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
8天前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
18 0
|
2月前
|
消息中间件 调度
如何区分进程、线程和协程?看这篇就够了!
本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
78 11
|
2月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
121 17
|
2月前
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
48 6

热门文章

最新文章