认识线程和创建线程

目录

1.认识多线程

1.1线程的概念

1.2进程和线程

1.2.1进程和线程用图描述关系

 1.2.2进程和线程的区别

1.3Java 的线程和操作系统线程的关系 

 2.创建线程

2.1继承 Thread 类

 2.2实现 Runnable 接口

 2.3匿名内部类创建 Thread 子类对象

2.4匿名内部类创建 Runnable 子类对象

2.5lambda 表达式创建 Runnable 子类对象 


1.认识多线程

1.1线程的概念

引入线程:进程虽然可以很好的实现并发编程,但在进行频繁的进程创建和销毁的过程中开销比较大(体现在资源的申请和释放上)。所以就发明了比进程更轻量的线程。

线程与进程相比:

(1)创建线程比创建进程更快 .
(2)销毁线程比销毁进程更快 .
(3)调度线程比调度进程更快 .
线程具体是什么?
  一个线程就是一个 " 执行流 ". 每个线程之间都可以按照顺讯执行自己的代码 . 多个线程之间 " 同时 " 执行 着多份代码.

1.2进程和线程

1.2.1进程和线程用图描述关系
1.进程是包含线程的 . 每个进程至少有一个线程存在,即主线程。
2.进程和进程之间不共享内存空间 . 同一个进程的线程之间共享同一个内存空间 .
 1.2.2进程和线程的区别

(高频面试题)

1.进程是包含线程的。

2.每个线程就是一个 独立的"执行流",可以单独执行一些代码,并参与到CPU的调度(状态,上下文,优先级,记账信息,每个线程都有自己的一份)

3.每个进程都有自己的资源,进程中的线程共用一份资源(内存空间和文件描述符表)

(2)与(3)说明:

进程是系统分配资源的最小单位,线程是系统调度的最小单位。

4.进程与进程之间不会相会影响,但 线程与线程之间会相会影响。如果一个进程中的某个线程抛出异常,可能会导致进程中的所有线程都异常终止。

1.3Java 的线程和操作系统线程的关系 

1.线程是操作系统中的概念 . 操作系统内核实现了线程这样的机制 , 并且对用户层提供了一些 API 供用户使用(例如 Linux pthread ).
2. Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装 .

注意:

(1)线程与线程之间可能会相互干扰,产生逻辑bug,引起线程安全。

(2)线程不是越多越好,线程太多调度开销可能会非常明显。


 

 2.创建线程

2.1继承 Thread

(1)继承 Thread 来创建一个线程类

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("这里是线程运行的代码");
    }
}

此处 run()不需要手动调动,在线程创建好之后JVM会自动调用执行(回调函数)。

(2)创建 MyThread 类的实例

MyThread t = new MyThread();

创建出的实例才是真线程。 

 (3)调用 start 方法启动线程 

t.start(); // 线程开始运行

此时才会真正调用系统API,在系统内核中创建出线程(执行run())。

 为啥要在系统内核中创建出线程?

因为程序有时需要对软硬件资源进行操作。

完整示例:

public class ThreadDemo1 {public static void main(String[] args) {Thread t = new MyThread();t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}class MyThread extends Thread{@Overridepublic void run() {while(true){System.out.println("MyThread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

 进程创建第一个线程时开销最大,之后的线程开销都比较小,但不是0,main线程其实是第一个线程。

 

一直循环…… 

 当有多个线程,它们的执行顺序是不确定的。


 使用 jconsole 命令观察线程

我们可以使用jdk自带的工具 jconsole查看当前Java进程中所有的线程

第一步,找到jdk

第二步,点进去,找到里面的bin文件点进去

第三步,在bin文件夹里搜索jconsole 

第四步,找到你所创建进程点击线程进行查看

 


 2.2实现 Runnable 接口

(1) 实现 Runnable 接口

class MyRunnable implements Runnable {
@Override
public void run () {
System . out . println ( " 这里是线程运行的代码 " );
  }
}

2) 创建 Thread 类实例, 调用 Thread 的构造方法时将 Runnable 对象作为 参数.

Thread t = new Thread(new MyRunnable());

(3) 调用 start 方法

t.start(); // 线程开始运行 

 完整示例:

public class ThreadDemo2 {public static void main(String[] args) {Thread t = new Thread(new MyRunnable());t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}class MyRunnable implements Runnable{@Overridepublic void run() {while(true){System.out.println("MyRunnable");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
这种写法其实就是把线程和要执行的任务进行了解耦合。
对比上面两种方法 :
1.继承 Thread , 直接使用 this 就表示当前线程对象的引用 .
2.实现 Runnable 接口 , this 表示的是 MyRunnable 的引用 . 需要使用 Thread.currentThread()

 2.3匿名内部类创建 Thread 子类对象

// 使用匿名类创建 Thread 子类对象
Thread t1 = new Thread () {
@Override
public void run () {
System . out . println ( " 使用匿名类创建 Thread 子类对象 " );
  }
};

  完整示例:

public class ThreadDemo3 {public static void main(String[] args) {Thread t=new Thread(){@Overridepublic void run() {while (true){System.out.println("使用匿名类创建 Thread 子类对象");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

2.4匿名内部类创建 Runnable 子类对象

// 使用匿名类创建 Runnable 子类对象
Thread t2 = new Thread ( new Runnable () {
@Override
public void run () {
System . out . println ( " 使用匿名类创建 Runnable 子类对象 " );
  }
});

  完整示例:

public class ThreadDemo4 {public static void main(String[] args) {Thread t=new Thread(new Runnable() {@Overridepublic void run() {while(true){System.out.println("使用匿名类创建Runnable子类对象");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}});t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

2.5lambda 表达式创建 Runnable 子类对象 

 lambda就是让方法看上去脱离类,单独存在。

// 使用 lambda 表达式创建 Runnable 子类对象
Thread t3 = new Thread (() -> System . out . println ( " 使用匿名类创建 Thread 子类对象 " ));
Thread t4 = new Thread (() -> {
System . out . println ( " 使用匿名类创建 Thread 子类对象 " );
});

  完整示例:

  public static void main(String[] args) {Thread t=new Thread(() -> {while(true){System.out.println("使用匿名类创建Runnable子类对象");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();while(true){System.out.println("main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

都看到这了,不如关注一下,给个免费的赞 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/210353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用贝叶斯网络检测因果关系,提升模型效果更科学(附Python代码)

虽然机器学习技术可以实现良好的性能,但提取与目标变量的因果关系并不直观。换句话说,就是:哪些变量对目标变量有直接的因果影响? 机器学习的一个分支是贝叶斯概率图模型(Bayesian probabilistic graphical models),也…

【Com通信】Com模块详细介绍

目录 前言 1. Com模块功能介绍 2.关键概念理解 3.功能详细设计 3.1 Introduction 3.2 General Functionality 3.2.1 AUTOSAR COM basis 3.2.2 Signal Values 3.2.3 Endianness Conversion and Sign Extension 3.2.4 Filtering 3.2.5 Signal Gateway 3.3 Normal Ope…

2.2 网络多线程(私聊、群发、发送文件、推送新闻、离线留言)

文章目录 一、私聊1.1 分析1.2 客户端1.2.1 MessageClientService 私聊类1.2.2 ClientConnectServerThread 线程类 1.3 服务端1.3.1 ServerConnectClientThread 线程类 1.4功能演示 二、群发消息2.1 分析2.2 客户端2.2.1 MessageClientService类2.2.2 ClientConnectServerThrea…

通过仿真理解完整的阵列信号噪声模型

概要 噪声对无线电设备的信号接收会造成影响,是通信、雷达、导航、遥感等工程应用领域中的关键考虑因素。通常认为阵列合成能够提升信噪比,但忽略了这一论断的前提,即不同通道引入的噪声互不相关。但实际应用中,接收的噪声不仅仅包含信道引入的不相关噪声,还包含从外界环…

1-6、编程语言排行榜

语雀原文链接 https://www.tiobe.com/tiobe-index/

IntelliJ IDEA创建一个Maven项目

在IDEA中创建Maven项目,前提是已经安装配置好Maven环境 。 本文主要使用的是IntelliJ IDEA 2022.2.1 (Community Edition) 1.创建一个新project:File>Project 2.修改Maven配置:File>Settings>搜索maven 创建好的工程如下: src/main…

Chart 8 内核优化

文章目录 前言8.1 内核融合和拆分8.2 编译选项8.3 Conformant(规范) vs. fast vs. native math functions8.4 Loop unrolling8.5 避免分支发散8.6 Handle image boundaries8.7 Avoid the use of size_t8.8 通用 vs. 具名内存地址空间8.9 Subgroup8.10 Us…

SpringSecurity6 | 自定义认证规则

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏&#xf…

移相干涉技术1-多种干涉条纹仿真模拟生成(原理转载+代码实现 包括模拟生成干涉条纹图)

过去的干涉测量技术是通过人的肉眼或者相机拍摄,来直观判断干涉图中条纹特征进而完成测量,该方法的不稳定因素(比如人的主观意志)很多,其精度误差在/10左右38];现代干涉测量技术通过将电子技术、计算机技术…

智能优化算法应用:基于厨师算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于厨师算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于厨师算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.厨师算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

一加 12 Pop-up快闪活动来袭,十城联动火爆开启

12 月 9 日,一加 12 Pop-up 快闪活动在北京、深圳、上海、广州等十城联动开启,各地加油欢聚快闪现场,抢先体验与购买一加 12。作为一加十年超越之作,一加 12 全球首发拥有医疗级护眼方案和行业第一 4500nit 峰值亮度的 2K 东方屏、…

C++新经典模板与泛型编程:策略类模板

策略类模板 在前面的博文中,策略类SumPolicy和MinPolicy都是普通的类,其中包含的是一个静态成员函数模板algorithm(),该函数模板包含两个类型模板参数。其实,也可以把SumPolicy和MinPolicy类写成类模板—直接把algorithm()中的两…

【Linux】无法使用 ifconfig 查看系统网络接口信息,报错 command not found: ifconfig

问题描述 ifconfig是一个用于配置和显示系统网络接口信息的命令行工具。它通常用于Unix、Linux和其他类Unix系统中。 通过ifconfig命令,你可以查看和修改系统中网络接口的配置信息,包括IP地址、子网掩码、MAC地址、MTU(最大传输单元&#x…

javacv踩坑记录

前一阵学习opencv,发现在做人脸识别的时候遇到一些类库不存在的情况,查找后发现是由于拓展包没有安装完全(仅安装了基础版)。由于网络的问题(初步猜测),始终无法安装好拓展包。 于是另辟蹊径&am…

[文档级关系抽取|ACL论文]文档级关系抽取中语言理解的基础模型

Did the Models Understand Documents? Benchmarking Models for Language Understanding in Document-Level Relation Extraction School of Computer Science, Fudan University | ACL 2023.06 | 原文链接 Background 过去的工作大多数都是从单个句子中收获更多的关系&am…

MongoDB中的$type操作符和limit与skip方法

本文主要介绍MongoDB中的$type操作符和limit与skip方法。 目录 MongoDB的$type操作符MongoDB的limit方法MongoDB的skip方法 MongoDB的$type操作符 MongoDB中的$type操作符用于检查一个字段的类型是否与指定的类型相匹配。它可以用于查询和投影操作。 $type操作符可以与以下数…

JVS低代码表单引擎:数据校验与处理的先锋

随着信息技术的迅速发展,数据校验与处理已经成为了各类应用中不可或缺的一环。尤其是在涉及敏感信息,如密码处理时,其安全性和准确性显得尤为重要。JVS低代码表单引擎提供了强大的文本组件触发逻辑校验功能,它能够在用户填写数据的…

模电·放大电路的分析方法——等效电路法

放大电路的分析方法——等效电路法 晶体管的直流模型及静态工作点的估算法晶体管共射h参数等效模型 h h h参数等效模型的由来参数的物理意义简化的h参数等效模型 r b e {r\tiny be} rbe的近似表达式 共射放大电路动态参数的分析电压放大倍数 A ˙ u \.{A}\tiny u A˙u输入电阻 …

【小米电脑管家】安装使用教程--非小米电脑

安装说明功能体验下载资源 Xiaomi HyperOS发布后,小米妙享电脑端独立版本也走向终点,最新的【小米电脑管家】将会内置妙享实现万物互联。那么本篇文章将分享非小米电脑用户如何绕过设备识别验证安装使用【小米电脑管家】实现万物互联 安装说明 1.解压文…

如何用Python编写俄罗斯方块Tetris游戏?

在本文中,我们将用Python代码构建一个令人惊叹的项目:俄罗斯方块游戏。在这个项目中,我们将使用pygame库来构建游戏。要创建此项目,请确保您的系统中安装了最新版本的Python。让我们开始吧! Pygame是一组跨平台的Pyth…