首页 > 编程语言 >并发编程(第一天)

并发编程(第一天)

时间:2024-08-09 19:26:15浏览次数:16  
标签:run 第一天 Thread 编程 t1 并发 线程 进程 sleep

进程与线程

进程

  • 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的
  • 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。
  • 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)

线程

  • 一个进程之内可以分为一到多个线程。
  • 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行
  • Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。 在 windows 中进程是不活动的,只是作 为线程的容器

二者对比

  • 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集
  • 进程拥有共享的资源,如内存空间等,供其内部的线程共享
  • 进程间通信较为复杂

        同一台计算机的进程通信称为 IPC(Inter-process communication)

        不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP

  • 线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量
  • 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低

线程的创建和运行线程

方法一,直接使用 Thread

// 构造方法的参数是给线程指定名字,推荐
Thread t1 = new Thread("t1") {
 @Override
 // run 方法内实现了要执行的任务
public void run() {
 log.debug("hello");
    }
 };
 t1.start();

方法二,使用 Runnable 配合 Thread

把【线程】和【任务】(要执行的代码)分开

  • Thread 代表线程
  • Runnable 可运行的任务(线程要执行的代码) 
// 创建任务对象
Runnable task2 = new Runnable() {
 @Override
 public void run() {
 log.debug("hello");
    }
 };
 // 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
 t2.start();

方法三,FutureTask 配合 Thread

FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况

// 创建任务对象
FutureTask<Integer> task3 = new FutureTask<>(() -> {
 log.debug("hello");
 return 100;
 });
 // 参数1 是任务对象; 参数2 是线程名字,推荐
new Thread(task3, "t3").start();
 // 主线程阻塞,同步等待 task 执行完毕的结果
Integer result = task3.get();
 log.debug("结果是:{}", result);

栈与栈帧

其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存,每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法 

start 与 run

直接调用 run 是在主线程中执行了 run,没有启动新的线程

使用 start 是启动新的线程,通过新的线程间接执行 run 中的代码

sleep 与 yield

sleep

1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)

2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出InterruptedException

3. 睡眠结束后的线程未必会立刻得到执行

4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性

yield

1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程

2. 具体的实现依赖于操作系统的任务调度器

join 方法详解

t1.join():意味着需要等待t1线程结束才会运行下面的代码

t1.join(1000):如果1000ms小于t1线程的执行时间,就会提前结束t1线程;如果时间大或相等,线程结束了,join就会直接结束(线程执行结束会导致 join 结束)。

join源码中,只会调用wait方法,并没有在结束时调用notify,这是因为线程在die的时候会自动调用自身的notifyAll方法,来释放所有的资源和锁。

 

标签:run,第一天,Thread,编程,t1,并发,线程,进程,sleep
From: https://blog.csdn.net/GD2604279407/article/details/141060591

相关文章

  • 深入分析编程命名规范:成员变量命名约定的比较与分析
    目录标题1.引言2.成员变量命名约定简介谷歌命名规范Qt命名规范微软命名规范其他使用`_`前缀的规范小结3.各命名规范的详细分析谷歌命名规范:成员变量后缀`_`Qt和微软命名规范:成员变量前缀`m_`其他使用`_`前缀的规范比较总结4.综合比较可读性可维护性学习曲......
  • AI编程工具FittenCode简直是懒人神器啊!
    AI编程简直太好用了,简直是懒人神器啊。自动帮我检查代码、排查错误、给出多种解决方案。快速且精准,教练级的教授知识、保姆级的贴身服务,而且免费、可以不眠不休。上一篇博文,介绍了VisualStudio如何安装AI编程工具FittenCode.今天,介绍一下FittenCode的具体应用。1.打开Fitt......
  • 区块链编程(二)
    golangpackageblockchainimport("bytes""crypto/sha256""encoding/binary""fmt""log""math""math/big")//Takethedatafromtheblock//createaco......
  • Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
    什么是面向对象编程(OOP)?OOP代表面向对象编程。过程式编程是编写执行数据操作的过程或方法,而面向对象编程则是创建包含数据和方法的对象。与过程式编程相比,面向对象编程具有以下几个优势:OOP更快且更易于执行OOP为程序提供了清晰的结构OOP有助于保持Kotlin代码的DRY......
  • 《信息学奥赛一本通编程启蒙》3031-3050(Scratch、C、C++、python)
    3031:练7.3买图书(C、C++、python)3031:练7.3买图书(C、C++、python)-CSDN博客3032:练7.4梯形面积(C、C++、python)3032:练7.4梯形面积(C、C++、python)-CSDN博客3033:【例8.1】人民币支付(Scratch、C、C++、python)3033:【例8.1】人民币支付(Scratch、C、C++、python)-CSDN博客3......
  • Delphi编程常用快捷键大全
    快捷键对于提高编程速度有着很重要的影响,本文汇总整理了Delphi常用的快捷键,供大家参考之用:Ctrl+PageUp将光标移至本屏的第一行,屏幕不滚动。Ctrl+PageDown将光标移至本屏的最后一行,屏幕不滚动。Ctrl+↓向下滚动屏幕,光标跟随滚动不出本屏。Ctrl+↑向上滚动屏幕,光标跟随滚动不出本屏......
  • 一个企业级的免费开源商城系统,无需专业编程知识,可视化DIY拖拽装修、包含PC、H5、多端
    前言在电子-商务领域,企业经常面临诸多挑战,如高昂的开发成-本、缺乏灵活性、以及难以满足个性化需求等。现有的商城软件往往功能固定,难以适应快速发展和变化的电商环境。为了解决这些痛点,需要一款灵活、可定制且易于扩展的商城系统,能够快速响应市场变化,满足不同企业的独特需求......
  • AOP -面向切面编程
    AOP-面向切面编程aop是oop(面向对象编程)的补充和完善。oop是一种纵向开发,然而当面对需要一些横向的功能如日志,就会导致大量重复的代码。aop利用横切把一些重复的非核心的代码插入到核心代码周围,不需要重复写很多遍。应用场景:日志记录,在方法的执行前后插入日志功能事务处......
  • 哪种编程语言更适合学习数据结构和算法:C++、Java 还是 Python?
    作为一名工程专业的学生,​​我正在尝试决定使用哪种编程语言来学习数据结构和算法(DSA)。我正在考虑C++,它提供高性能和强大的标准模板库,但对于初学者来说可能很复杂。Java具有强大的语法和内置集合,使DSA概念更容易掌握,尽管我不确定它与C++相比的性能。Python以其简单性和......
  • 函数式编程-Stream流
    一、函数式编程-Stream流1、概述1.1为什么学?能够看懂公司里的代码大数量下处理集合效率高代码可读性高消灭嵌套地狱普通写法与函数式编程写法对比:普通写法//查询未成年作家的评分在70以上的书籍由于洋流影响所以作家和书籍可能出现重复,需要进行去重List<B......