多线程的使用

进程与线程

进程:

1、进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用微信,又启动了一个进程,操作系统将为其分配新的内存空间。

2、进程是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。

线程:

1、线程是由进程创建的,是进程的一个实体。

2、一个进程可以拥有多个线程。

3、分类:                                                                                                                                        单线程:同一个时刻,只允许执行一个线程。                                                                                 多线程:同一个时刻,可以执行多个线程。

4、并发与并行

并发:同一个时刻,多个任务交替执行,造成一种“貌似同时”的错觉,单核CPU就是并发的。

并行:同一个时刻,多个任务同时执行,多核cpu可以实现并行。

注:两个可以同时存在。

多线程的基本使用

方式一:继承于 Thread类

步聚:

①创建一个继承于Threud类的子类
②重写Thread类的run()
③创建Thread类的子类的对象
④通过此对象调用start()
注:将此线程执行的操作声明在run()中

start()的作用:
启动当前线程 ②调用当前线程的run()(run就是一个普通的方法)

注:start()方法调用startO()方法后,该线程并不一定会立马执行,只是将线程变成了可运行状态。具体什么时候执行,取决于CPU,由CPU统一调度。

问题:
①不能通过直接调用run()的方式来启动线程(run方法就是一个普通的方法,没有真正的启动一个线程(此时run方法所在的线程就是调用run方法的对象所在的线程,而不是由这个对象单独开辟出一个新的线程)),而且不会向下执行,直到run执行完成。

public static void main (String [] args){a a = new a();a.run();    //此时所在的线程为main线程a.start():    //此时单独开辟出一个新的线程
}
class a extends Thread{}

②不可让已经start()的线程去再启动一个线程。
③要想重新启动一个线程,须重新创建一个对象。

注:主线程结束,子线程可能还没结束,所以进程依旧存在(可在控制台输入JConsole监控线程的执行情况)。

方式二:实现Runnable接口

步骤:

创建一个实现了Runnable 接口的类。
②实现类去重写Runnable中的抽象方法:run()。
③创建实现类的对象。
④将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象(t=new Thread(③中的对象))。
⑤通过Thread类的对象调用start()。(t.start())

Thread类处理Runnable实现类的简单实现

class MyThread implements Runnable {private Runnable target = null;    //属性,类型是 Runnablepublic MyThread(Runnable target){    //传入接口实现类,初始化target this.target = target;}@0verridepublic void run() {    //动态绑定,调用实现类的run方法if(target != null){target.run();}}    public void start() {    //调用底层逻辑start0();    }public void start0(){    //真正的实现创建线程,并调用run方法run();}}

方法二和方法一的比较

1、开发中,优先选择实现 Runnable接口的方式。
2、Runnable实现的方式没有类的单继承性的局限性。
3、实现的方式更适合来处理多个线程有共同数据的情况。
4、Thread 本身也实现了Runnable接口。


 

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

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

相关文章

数据库系统概论期末经典大题讲解(范式提升、求闭包、求主码)

上一次我们介绍了数据库中关系代数查询,从选择、投影到连接等操作符,探索了数据库查询 大家可以移步我的文章:数据库系统概论期末经典大题讲解(用关系代数进行查询)-CSDN博客 今天,我们将继续沿着数据库系统…

《python每天一小段》--12 数据可视化《1》

欢迎阅读《Python每天一小段》系列!在本篇中,将使用Python Matplotlib实现数据可视化的简单图形。 一、概念 Matplotlib是一个流行的Python数据可视化库,它提供了丰富的绘图功能,可以创建各种类型的图表,包括折线图、…

Spring框架学习:Bean生命周期

目录 SpringBean的生命周期 Bean实例属性填充 三级缓存 常用的Aware接口 Spring IoC容器实例化Bean总结 SpringBean的生命周期 Spring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到…

【MyBatis系列】MyBatis字符串问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理

1、参考文档 Spring Cloud Alibaba参考文档 https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html Spring Cloud Alibaba官方文档 https://github.com/alibaba/spring-cloud-alibaba/wiki/ 2、引入 Alibaba 依赖 每个 SpringBoot 都有对应的…

css中2D和3D的区别

CSS中2D和3D的主要区别在于: 维度不同:2D是二维平面,3D是三维空间。可视角度不同:2D只能从一个平面角度看,而3D可以在多个角度上观察。技术难度不同:3D效果需要更复杂的技术支持,如矩阵变换&am…

javascript实现Stack(栈)数据结构

上一篇文章我们理解了List这种数据结构,知道了它的特点和一些使用场景,这篇文章我们就来看一下栈这种数据结构,这里的栈可不是客栈哦,哈哈 栈其实和List非常像,使用javascript实现都是基于数组来实现 尝试理解Stack …

6种常见的JS模块打包器

前言 JS模块打包器是一种工具,它可以将多个JS文件或模块合并成一个或多个输出文件,以便在浏览器或其他环境中使用。 JS模块打包器的作用有: 优化代码:通过压缩、混淆、删除无用代码等方式,减少代码的体积和复杂度&…

windows系统和虚拟机上ubuntu系统通过虚拟串口进行通信

本文的目的是实现windows系统和虚拟机上安装的ubuntu通过串口进行通信。为了直观观测串口收发数据的内容,需要在windows系统和ubuntu系统使用串口助手来进行监听。windows系统端用的监听工具是串口助手SSCOM,ubuntu系统端使用的串口助手是CuteCom。 ubu…

OpenCL学习笔记(一)开发环境搭建(win10+vs2019)

前言 异构编程开发,在高性能编程中有重要的,笔者本次只简单介绍下,如何搭建简单的开发环境,可以供有需要的小伙伴们开发测试使用 一、获取opencl的sdk库 1.使用cuda库 若本机有Nvidia的显卡,在安装cuda库后&#x…

如何提高大模型在超长上下文的表现?Claude实验表明加一句prompt立即提升效果~

本文来自DataLearnerAI官方网站:如何提高大模型在超长上下文的表现?Claude实验表明加一句prompt立即提升效果~ | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051701947131881 Claude 2.1版本的模型上下文长度最高拓展到200K&am…

【Flink系列四】Window及Watermark

3.1、window 在 Flink 中 Window 可以将无限流切分成有限流,是处理有限流的核心组件,现在 Flink 中 Window 可以是时间驱动的(Time Window),也可以是数据驱动的(Count Window)。 Flink中的窗口…

c jpeg YUV图片帧分割成 8*8 块 ,与逆向把8*8还原为帧

1. 正向分割为若干8*8 块 下面的程序为通用程序&#xff0c;可以分割任意块 #include <stdlib.h> #include <string.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h>…

如果微软20年前开发.net core,JAVA会不会和IE一样倒下了

可以跨平台&#xff0c;大量类库&#xff0c;微软亲自操刀&#xff0c;性能一流&#xff0c;因为没有做跨平台&#xff0c;.NET被 python,javascript等抢了一半以上市场。 如果微软早早的推出类似.net core这样的跨平台语言&#xff0c;.net程序猿还会出在这样的尴尬局面吗众所…

Java基础-开发流程以及HelloWorld程序

目录 1. Java的开发流程2. HelloWorld 1. Java的开发流程 开发Java程序&#xff0c;需要三个步骤&#xff1a;编写代码&#xff0c;编译代码&#xff0c;运行代码 2. HelloWorld 编写代码 public class HelloWorld {public static void main(String[] args) {System.out.pri…

Ribbon 饥饿加载

Ribbon默认是采用懒加载&#xff0c;即第一次访问时才会去创建LoadBalanceClient&#xff0c;请求时间会很长而饥饿加载则会在项目启动时创建&#xff0c;降低第一次访问的耗时&#xff0c;通过下面配置开启饥饿加载: 一、懒加载 Ribbon 默认为懒加载即在首次启动Application…

代码随想录二刷 |二叉树 | 二叉树的层序遍历

代码随想录二刷 &#xff5c;二叉树 &#xff5c; 二叉树的层序遍历 题目描述解题思路代码实现 题目描述 102.二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例…

Flask 最佳实践(一)

Flask是一个轻量级而强大的Python Web框架&#xff0c;它的简洁性和灵活性使其成为许多开发者的首选。然而&#xff0c;为了确保项目的可维护性和可扩展性&#xff0c;我们需要遵循一些最佳实践。本文将探讨Flask中一些关键的最佳实践。 1. 项目结构 构建一个清晰的项目结构是…

Java实现Socket聊天室

一、网络编程是什么&#xff1f; 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行数据传输。 应用场景&#xff1a;即时通讯、网游对战、金融证券、国际贸易、邮件、等等。 不管是什么场景&#xff0c;都是计算机与计算机之间通过网络进行数据传输。 …

软件测试之接口测试自动化(详解版)

本着以和大家交流如何实现高效的接口测试为出发点&#xff0c;本文包含了我在接口测试领域的一些方法和心得&#xff0c;希望大家一起讨论和分享&#xff0c;内容包括但不仅限于&#xff1a; 服务端接口测试介绍接口测试自动化介绍接口测试自动化实践关于接口测试自动化的思考…