Java基础--多线程

线程和进程

线程(Thread)和进程(Process)是操作系统中两种不同的并发执行机制,用于实现多任务并行处理。虽然它们都旨在提高计算机系统的资源利用率和任务执行效率,但它们在概念、资源分配、通信方式以及管理复杂度等方面存在显著差异。

进程 (Process)

1. 定义:

•进程是操作系统中独立运行的基本单元,代表一个正在执行的程序实例。每个进程拥有自己的虚拟地址空间,包括代码、数据、堆、栈等资源,以及一组系统资源(如打开的文件、网络连接、信号处理器等)。操作系统通过进程来隔离不同应用程序的执行环境,确保它们互不影响。

2. 特点:

•资源独立:每个进程都有独立的内存空间,包含各自的全局变量、堆、栈等。这意味着一个进程无法直接访问另一个进程的内存,保证了数据的安全性。

•进程间通信:进程间的通信通常需要借助于操作系统提供的专门机制,如管道、套接字、消息队列、共享内存、信号等,因为它们各自在独立的内存空间中运行。

•调度开销:创建、销毁或切换进程时,操作系统需要进行上下文切换,涉及内存管理单元(MMU)的切换、寄存器状态保存和恢复、缓存刷新等操作,开销相对较大。

•生命期:进程可以长期存在,也可以短暂运行后结束。进程之间没有强制的父子关系,但可以通过fork()系统调用创建子进程,形成进程树。

线程 (Thread)

1. 定义:

•线程是进程内的轻量级执行单元,是进程中单一顺序的控制流。一个进程中可以有一个或多个线程,它们共享同一进程的地址空间(包括代码段、数据段、堆等),但每个线程有自己的程序计数器、寄存器集合和栈。线程允许在同一进程中并发执行多个控制流,从而实现内部并行。

2. 特点:

•资源共享:同一进程中的所有线程共享相同的内存地址空间,可以直接访问相同的变量和资源。因此,线程间的通信通常比进程间通信更简单高效,但也需要同步机制(如锁、条件变量、信号量等)来避免数据竞争和死锁等问题。

•线程间通信:由于共享内存,线程间的通信成本较低,可以直接读写共享数据。但为了数据的一致性,需要使用适当的同步原语进行协调。

•调度开销:线程的创建、销毁和切换比进程要快,因为它们不需要切换虚拟内存地址空间,只需保存和恢复少量的线程私有寄存器状态。这使得线程更适合于需要频繁创建和销毁的任务。

•生命期:线程的生命期通常与所属进程紧密关联,当进程终止时,其所有线程也会随之结束。线程可以由进程自行创建,并在同一个进程中并发执行。总结•进程提供更强的隔离性和资源保护,适合于需要严格隔离的大型、复杂的独立任务。进程间的通信较为复杂,但能有效防止一个任务对另一个任务的数据破坏。

•线程则提供了更高效的上下文切换和资源共享,适用于需要大量并发且频繁通信的任务,尤其是在单个应用内部。但由于共享内存,线程间的同步控制更为重要,以避免竞态条件和数据不一致性。

线程

线程创建方式:(常见的四种)

方法一:继承Thread类,作为线程对象存在(继承Thread对象)

        创建一个新类,让它继承自 java.lang.Thread 类。然后重写 run() 方法,定义线程执行的具体逻辑。创建该类的实例,并调用其 start() 方法来启动线程。

class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的代码
        System.out.println("Thread is running...");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();  // 启动线程
    }
}

方法二:实现runnable接口,作为线程任务存在

        创建一个类,实现 java.lang.Runnable 接口,并实现其中的 run() 方法。然后将这个类的实例作为参数传递给 Thread 类的构造函数,创建一个新的 Thread 对象并启动。

class MyT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值