认识线程和创建线程

目录

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.1.1.多线程的发展--对cpu性能的压榨史

一.压榨历史 1.单进程人工切换。纸带机。只能解决简单的数学问题。 2.单道批处理。多进程批处理。多个任务批量执行。解决手动操作时需要人工切换作业导致的系统利用率低的问题 3.多进程并行处理。把程序写在不同的内存位置来回切换。当一个作业在等待I/O处理时,…

C语言-函数STRCPY

strcpy char *strcpy(char *restrict dst, const char *restrict src);把src的字符串拷贝到dst restrict表明src和dst不重叠(C99) 返回dst 为了能链起代码来 复制一个字符串 char dst (char)malloc(strlen(src) 1); strcpy(dst, src);

从单向链表中删除指定值的节点

输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。 链表的值不能重复。构造过程,例如输入一行数据为:6 2 1 2 3 2 5 1 4 5 7 2 2则第一个参数6表示输入总共6个节点,第二个参数…

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

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

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…

使用NanoPi NEO4进行rtsp拉流

使用系统:FriendlyDesktop系统 使用python进行编程,分别使用opencv与ffmpeg进行功能实现,折腾了挺长时间,代码很简单,主要是环境搭建。主要是python、opencv-python、ffmpeg-python、numpy之间的版本兼容,…

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…

七个常用<python装饰器>---足够改进代码质量 (保姆详解)

前言: 写代码嘛,关键是得让它既好用又好看,这不,Python装饰器就摆在那儿。咱们程序员有时也得有那么点艺术家的腔调:讲求效率,追求代码的简洁优雅,偶尔还得装装X,不是吗? 翻开人家…

SpringSecurity6 | 自定义认证规则

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

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

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

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

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

代码随想录-刷题第二十一天

530.二叉搜索树的最小绝对差 题目链接&#xff1a;530. 二叉搜索树的最小绝对差 思路&#xff1a;二叉搜索树的中序遍历是有序的。根据二叉搜索树的这个特性来解题。 class Solution {// 同样利用二叉树中序遍历是一个有序数组。private List<Integer> list new Arra…

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

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

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

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

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

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

javacv踩坑记录

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