【JavaEE】线程的概念

文章目录

  • 1、什么是线程
  • 2、进程和线程的区别
  • 3、多线程的概述
  • 4、在Java中实现多线程的方法
    • 1.继承Thread类
    • 2.实现Runnable接口
    • 3.使用匿名内部类来继承Thread类,实现run方法
    • 4.使用匿名内部类来实现Runnable接口,实现run方法
    • 5.使用 lambda表达式


1、什么是线程

线程是进程中实际执行的最小单位,在一个进程中,可以存在一个或者多个线程,同一个进程中的若干线程之间,是共用相同的内存资源和文件资源,线程是系统调度执行的基本单位
利用线程可以解决进程创建/销毁开销大的问题
线程thread也被称为 “轻量级进程” 创建/销毁开销小
线程比进程更轻量,核心在于创建进程可能要包含多个线程,在这个过程中涉及到资源分配/资源释放,创建线程相当于资源已经有了,省去了资源分配/释放步骤
描述进程,使用的PCB这样的结构体,事实上更严格的说,一个PCB其实描述一个线程,若干个PCB联合在一起,是描述一个进程的

2、进程和线程的区别

1.进程是包含线程的,每一个进程至少有一个线程存在,即主线程
2.进程和线程之间不共享内存空间,同一个进程的线程之间共享同一个内存空间
3.进程是系统分配资源的最小单位,线程是系统调度的最小单位
4.一个进程挂了一般不影响其他进程,但是一个线程挂了,可能把同进程内的其他线程一起带走(整个进程崩溃)

3、多线程的概述

多线程是指在一个程序中同时执行多个线程,每个线程可以独立执行不同的任务或者操作,在Java中,多线程可以让程序更高效的利用计算机的多核处理器,提高程序的性能和响应速度,多个线程之间都是并发执行的

4、在Java中实现多线程的方法

1.继承Thread类

创建一个类继承Thread类,重写里面的run方法,这里的run方法描述了线程具体要干些什么在主函数中用start方法启动,这样就创建了一个线程,在调用start方法之后,系统会自动调用重写的run方法,也就是回调函数,交给系统执行run方法

class MyThread extends Thread {
    @Override
    public void run() {
        while (true) {
            System.out.println("hello thread");
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();
        while (true) {
            System.out.println("hello main");
        }
    }
}

运行结果:
在这里插入图片描述
在main中有一个线程,我们称为主线程,主线程是自动创建的,而thread线程是我们手动创建的
多线程的调度顺序是无序的,在操作系统内部也称为“抢占式执行”,任何一个线程,在执行到任何一个代码的过程中,都可以被其它线程抢占掉它的cpu资源,于是cpu就给别的下次执行了,
在这里我们还可以使用 jconsole.exe 这个应用程序,来观察这个多线程代码:
在这里插入图片描述
在这里插入图片描述
点击连接,进入页面之后再点击线程就可以了
在这里插入图片描述
上图表示有多少个线程
在这里插入图片描述
上图圈起来的就表示我们创建的两个线程
剩下的线程都是jvm帮我们做的一些其他工作,涉及到的负责垃圾回收,负责记录调试信息等

2.实现Runnable接口

创建一个类实现Runnable接口,并重写run方法

class MyRunnable implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("hello thread");
    }
}
public class Test2 {
    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();

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

3.使用匿名内部类来继承Thread类,实现run方法

public class Test3 {
    public static void main(String[] args) {
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello thread");
                }
            }
        }.start();

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

4.使用匿名内部类来实现Runnable接口,实现run方法

public class Test4 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello thread");
                }
            }
        });
        
        thread.start();
        while (true) {
            System.out.println("hello main");            
        }
    }
}

5.使用 lambda表达式

public class Test5 {
    public static void main(String[] args) {
        Thread thread = new Thread(()-> {
            while (true) {
                System.out.println("hello thread");                
            }
        });

        //创建线程 启动线程
        thread.start();
        while (true) {
            System.out.println("hello main");            
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu20中ros与anaconda的python版本冲突问题

系统环境 原本系统是ubuntu20 noetic,python都在/usr/bin中,一共是两个版本的python,一个是python3.8,另一个是python2.7。 问题发现 当安装anaconda后,并且将anaconda的bin目录加入到系统环境中时候,…

【微服务】——Docker 基础知识

这里写自定义目录标题 1.1 了解Docker1.1.1应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安装Docker——未实践 2.Dock…

【莫比乌斯变换-03】python实现圆对圆的变换

文章目录 一、说明二、python实现复平面的莫比乌斯变换三、线的变换四、画笑脸 一、说明 我们在前面的文章中,叙述了莫比乌斯变换的复数分析,以及种种几何属性,本篇中叙述如何程序地实现:复平面上的圆在莫比乌斯变换下的图像是另…

【ONE·基础算法 || 回溯和剪枝(暴搜/深搜)】

总言 主要内容:编程题举例,熟悉理解回溯剪枝类题型(如何画决策树,如何使用深搜进行递归,如何运用剪枝,如何在一维数组/二维数组中使用)。 文章目录 总言1、回溯和剪枝2、全排列(med…

【机器学习】BK- SDM与LCM的融合策略在文本到图像生成中的应用

突破边缘设备限制:BK-SDM与LCM的融合策略在文本到图像生成中的应用 一、引言二、稳定扩散算法的挑战与现状三、BK-SDM与LCM的融合策略利用高质量图像-文本对进行训练为LCM量身定制高级蒸馏过程 四、结论与展望 一、引言 随着人工智能技术的飞速发展,文本…

数据结构(十)----图

目录 一.图的概念 1.图的定义 2.图的类别 3.图的性质 4.几种特殊形态的图 二.图的存储结构 1.邻接矩阵(顺序存储) 2.邻接表(顺序链式存储) 3.十字链表 4.邻接多重表 四.图的遍历 1.广度优先遍历(BFS&#…

Mysql复习笔记: 基础概念(待补充)

一. 基础概念 通用概念: 网络连接必须得分配给一个线程去进行处理,由一个线程来监听请求以及读取请求数据,比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句 在数据库中,哪怕执行一条SQL语句,其实也可以是一个独立…

Python | Leetcode Python题解之第59题螺旋矩阵II

题目&#xff1a; 题解&#xff1a; class Solution:def generateMatrix(self, n: int) -> List[List[int]]:matrix [[0] * n for _ in range(n)]num 1left, right, top, bottom 0, n - 1, 0, n - 1while left < right and top < bottom:for col in range(left, r…

pandas学习笔记11

DataFrame结构 DataFrame 一个表格型的数据结构&#xff0c;既有行标签&#xff08;index&#xff09;&#xff0c;又有列标签&#xff08;columns&#xff09;&#xff0c;它也被称异构数据表&#xff0c;所谓异构&#xff0c;指的是表格中每列的数据类型可以不同&#xff0c;…

python中type,object,class 三者关系

type,object,class 三者关系 在python中&#xff0c;所有类的创建关系遵循&#xff1a; type -> int -> 1 type -> class -> obj例如&#xff1a; a 1 b "abc" print(type(1)) # <class int> 返回对象的类型 print(type(int)) …

力扣打卡第二天

206. 反转链表 class Solution { public:ListNode* reverseList(ListNode* head) {// //迭代法// ListNode *pre nullptr;// ListNode *curr head;// while(curr){// ListNode *next curr -> next;// curr -> next pre;// pre curr;// curr next;/…

Unity UGUI Image 点击事件忽略空白像素区域

我们会遇到图片不是方形的不规则图片。这个时候我们希望只有点击到图像内容本身才算点击&#xff0c;点击空白区域则不算点击。而UGUI对图片的处理是整个图片都会算作点击区域&#xff0c;这样不能满足于我们的使用需求了。 首先我们需要把图片本身的Read/Write 选项打开 然后…

质因数分解(cpp实现)--一种快速求得一个数有多少个因子的黑魔法

前言 最近机试没少吃不会质因数分解的亏&#xff0c;用传统的求得因子个数只能过一点点…(ex, 20%) 质因数分解后&#xff0c;可以将因子问题转化为 集合的组合问题&#xff0c;因此会很快&#xff0c;目测是 l o g n log n logn (n是该整数的值)。 传统解法 假设输入整数的…

基于OpenCv的图像特征点检测

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

从0开始linux(1)——文件操作

欢迎来到博主的专栏——从0开始linux 博主ID&#xff1a;代码小豪 博主使用的linux发行版是&#xff1a;CentOS 7.6 不同版本下的操作可能存在差异 文章目录 命令文件操作命令文件树和文件路径文件树绝对路径相对路径 文件属性tree指令删除文件复制文件 大家还记得在小学第一次…

C语言-链表实现贪吃蛇控制台游戏

使用C语言和链表实现贪吃蛇游戏 一、引言 贪吃蛇游戏是一个经典的游戏&#xff0c;它的玩法简单而富有挑战性。在这个博客中&#xff0c;我将分享如何使用C语言和链表数据结构来自主实现贪吃蛇游戏。我会详细介绍游戏的设计思路、编码过程、遇到的问题及解决方案&#xff0c;…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 1

以下摘录一些章节片段&#xff1a; 1. 概论 自动驾驶系统的认知中有一些模糊的地方&#xff0c;比如自动驾驶系统如何定义的问题&#xff0c;自动驾驶的研发为什么会有那么多的子模块&#xff0c;怎么才算自动驾驶落地等等。本章想先给读者一个概括介绍&#xff0c;了解自动驾…

Rust 生命周期浅谈

1. 简述 Rust 中的每一个引用都有其 生命周期&#xff08;lifetime&#xff09;&#xff0c;也就是引用保持有效的作用域。大部分时候生命周期是隐含并可以推断的&#xff0c;正如大部分时候类型也是可以推断的一样。类似于当因为有多种可能类型的时候必须注明类型&#xff0c;…

JAVA语言开发的智慧城管系统源码:技术架构Vue+后端框架Spring boot+数据库MySQL

通过综合应用计算机技术、网络技术、现代通信技术等多种信息技术&#xff0c;充分融合RS遥感技术、GPS全球定位技术、GIS地理信息系统&#xff0c;开始建设一个动态可视的、实时更新的、精细量化的城市管理系统。智慧城管将采用云平台架构方式进行建设&#xff0c;基于现有数字…

【idea-sprongboot项目】SSH连接云服务器进行远程开发

继上一篇博客【阿里云服务器】ubuntu 22.04.1安装docker以及部署java环境-CSDN博客 目录 五、远程开发方式 1&#xff09;SSH进行远程开发 步骤 配置文件同步 window电脑远程操控 正式通过window电脑远程操控 运行在linux服务器上的远程程序 调试在linux服务器上的远程程…
最新文章