首页 > 系统相关 >Java:进程和线程

Java:进程和线程

时间:2024-08-02 12:25:29浏览次数:13  
标签:Runnable Java Thread 创建 线程 进程 run

文章目录

并发编程: 通过写特殊的代码,把多个CPU核心都利用起来,这样的代码就称为“并发编程”。

多进程编程,就是一种典型的并发编程。

多进程编程,最大的问题是进程太“重”(创建进程 / 销毁进程的开销比较大)

为了解决进程开销比较大的问题,于是发明了“线程”(Thread)

线程可以理解成更轻量的进程,它也能解决并发编程的问题,但是创建/销毁的开销,比进程更低

所谓的进程,在系统中是通过PCB这样的结构体来描述,通过链表的形式来组织的.
对于系统中,线程,同样也是通过PCB来描述的(Linux)

一个进程,其实是一组PCB.
一个线程,是一个PCB.
一个进程中,可以包含多个线程,此时每个线程,都可以独立的到CPU上调度执行

线程是系统"调度执行"的基本单位
进程是系统"资源分配"的基本单位
如果有多个线程在一个进程中,那么每个线程都会有自己的状态,优先级,上下文,记账信息, 每个线程都会各自独立的在CPU上调度执行.
同一个进程中的这些线程,共用一份系统资源(CPU,内存,硬盘,网络带宽…)

线程比进程更轻量,主要就在于创建线程省去了"分配资源"(开销大)的过程,销毁线程也省去了"释放资源"的过程.

一旦创建进程,同时也会创建第一个线程 => 就会负责分配资源…
一旦后续创建第二,第三个线程 就不必再重新分配资源了

举个例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进程线程的概念和区别总结

  1. 进程包含线程
    一个进程里可以有一个线程,也可以有多个线程,不能没有线程
  2. 进程是系统资源分配的基本单位
    线程是系统调度执行的基本单位
  3. 同一个进程里的线程之间,共用同一份系统资源(内存,硬盘,网络带宽等…)尤其是"内存资源",就是代码中定义的变量/对象…(编程中,多个线程是可以共用同一份变量的)
  4. 线程是当下实现并发编程的主流方式,通过多线程就可以充分利用好多核CPU
    但是,也不是线程数目越多就越好的,线程数目达到一定程度,把多个核心都利用充分了之后,此时继续增加线程,无法再提供效率,甚至可能会影响效率(线程调度也是有开销的)
  5. 多个线程之间,可能会相互影响.线程安全问题,一个线程抛出异常,可能会把其他线程一起带走.
  6. 多个进程之间,一般不会相互影响,一个进程崩溃了,不会影响到其他进程(这一点也称为"进程的隔离性").

如何创建线程

1.继承Thread重写run

创建类,继承Thread重写run方法

class MyThread extends Thread {
	@Override
	public void run() {
		//这里写的代码,就是即将创建出的线程要执行的逻辑
	}
}

在main方法中创建实例

public static void main() {
	MyThread t = new MyThread();
	//创建线程
	t.start;
}

调用start就会在进程内部创建出一个新的线程,新的线程就会执行刚才run里面的代码

2.实现Runnable重写run


class MyRunnable implements Runnable {
    @Override
    public void run() {
        //描述了线程要完成的逻辑是啥
    }
}


//通过Runnable的方法来创建线程
public class Demo2 {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread t = new Thread(runnable);
        t.start();

        while(true) {
            System.out.println("hello main");
        }
    }
}

Runnable 就是用来描述"要执行的任务"是什么.

有的人认为Runnable这种做法更有利于"解耦合"
理由:这个Runnable只是一个任务,并不是和"线程"这样的概念强相关,后续执行这个任务的载体,既可以是线程,也可以是其他的东西(比如线程池,虚拟线程).

3.继承Thread重写run,通过匿名内部类来实现

本质上和1一样

    public static void main(String[] args) {
        Thread t = new Thread() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello");
                }
            }
        };
    }
  1. 定义内部类,这个类是Thread的子类
  2. 类的内部重写父类的run方法
  3. 创建一个子类的实例,并且把实例的引用赋值给了t

虚拟线程

线程是轻量级进程,因为进程太重量了
随着对于性能要求进一步提高,我们开始嫌弃线程也太重量了
于是引入了"协程"(轻量级线程,纤程)

这个协程概念,在后续的Java版本中被引入了,起的名字叫"虚拟线程"

标签:Runnable,Java,Thread,创建,线程,进程,run
From: https://blog.csdn.net/qrwitu142857/article/details/140388160

相关文章

  • [0362]基于JAVA的储能EMS能量智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的储能EMS能量智慧管理系统的设计与实现指导老师(一)选题的背景和意义在当前全球能源结构转型和可持续发展战略的大背景下,储能技术作为电力系统灵活性的重要支撑手段,其智慧化、精细化管理已成为提......
  • [0359]基于JAVA的健身房人脸识别智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的健身房人脸识别智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景与意义:随着我国全民健身意识的提高和生活质量的改善,健身房作为公众参与体育锻炼的重要场所,其运营管理和服务水平......
  • 【原创】java+ssm+mysql图书信息管理系统设计与实现
    个人主页:程序员杨工个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战开发背景:随着数字化和信息化技术的飞速发展,传统的图书馆管理方式已经逐渐不能满足现代社会的需求。数字化技术为......
  • day16 Java基础——JavaDoc生成文档
    day16Java基础——JavaDoc生成文档目录day16Java基础——JavaDoc生成文档1.什么是JavaDoc2.生成JavaDoc2.1通过命令行生成JavaDoc2.2使用IDEA生成JavaDoc1.什么是JavaDocJavaDoc是一种标准的、用于生成Java代码API文档的工具。它通过在Java源代码中特定的......
  • java 后端 控制跨域问题
     @ComponentpublicclassUserLoginInterceptorimplementsHandlerInterceptor{ privatestaticfinalLoggerlogger=LoggerFactory.getLogger(UserLoginInterceptor.class); @Value("${zyplayer.doc.manage.originDomainRegex:}") privateStringorig......
  • 深入理解Java中的时间处理与时区管理
    在Java开发中,时间处理和时区管理是常见的需求,特别是在全球化应用中。Java8引入了新的时间API(java.time包),使时间处理变得更加直观和高效。本文将详细介绍Java中的时间处理与时区管理,通过丰富的代码示例帮助读者掌握这些概念。1.Java8之前的时间处理在Java8之前,时间处理主......
  • Java中的运算符
    Java中的运算符Java中的运算符用于执行程序中的各种操作,如赋值、算术运算、比较、逻辑运算等。以下是Java中的主要运算符类型及其用法:赋值运算符(=):用于将右侧的值赋给左侧的变量。算术运算符:+加法-减法*乘法/除法%取模(求余数)++递增(使变量值增加1)--......
  • Java身份证二要素核验集成方式、身份认证
    身份证二要素核验是实名认证中比较简单、便捷的身份验证技术,其主要核验身份证号码、姓名两个要素信息是否一致,从而确保用户注册时提供身份的真实性,,以此来保障人们的财产及信息安全。现如今无论是人们的生活还是工作,均需要进行个人信息的实名认证,下面以身份证二要素实名认证Jav......
  • Java的编译和运行命令
    Java的编译和运行命令Java是一种编译型语言,但与传统的编译型语言(如C或C++)不同,Java的编译和运行过程涉及到几个关键步骤,这些步骤使得Java能够实现其“一次编写,到处运行”(WriteOnce,RunAnywhere,WORA)的特性。以下是Java编译和运行的基本原理:编写源代码:开发者使用文本编辑器......
  • Java swing项目汇总
    Javaswing项目汇总序号项目名称1(无需数据库)swing推箱子小游戏2(无需数据库)swing学生基本信息管理系统3(无需数据库)仓库管理系统(源码+详细注释+详细报告)4(无需数据库)调色盘应用5(无需数据库)课程成绩录入系统6(无需数据库)课程信息管理系统7swingsqlserver学生管理系统(详细报告+......