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、程序计数器、寄存器集合和栈等执行上下文。

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

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

目录
相关文章
|
10天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
6天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9
|
7天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
9天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
6天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
9天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
24 3
|
8天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
11天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
9天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
20 1
|
9天前
|
Java UED
Java中的多线程编程基础与实践
【10月更文挑战第35天】在Java的世界中,多线程是提升应用性能和响应性的利器。本文将深入浅出地介绍如何在Java中创建和管理线程,以及如何利用同步机制确保数据一致性。我们将从简单的“Hello, World!”线程示例出发,逐步探索线程池的高效使用,并讨论常见的多线程问题。无论你是Java新手还是希望深化理解,这篇文章都将为你打开多线程的大门。