当前位置: 首页 > news >正文

Java进行多线程编程?(lambda表达式~)

本文标题:Java进行多线程编程?那么,Java为啥不学学如何进程多进程编程呢??原因在于:Java圈子中不提倡多进程编程~~

接下来,我们来写一个最为基础/入门的HelloWord程序来感受如何进行多线程~~
Java标准库提供了一个类Thread能够表示一个线程~

public class MyThread extends Thread {//继承:创建一个类MyThread,继承标准库的Thread@Overridepublic void run(){//重写,子类重写父类的方法System.out.println("Hello Word");}public static void main(String[] args) {//先创建MyThread实列,t的引用实际上是指向子类的实列Thread t=new MyThread();//启动线程,再进程中搞了另外一个流水线,新的流水线开始并发的执行另外一个逻辑了~t.start();}
}

在上述的代码段中,主要涉及到两个线程:

  1. main方法所对应的线程(一个进程中至少得有一个线程),也可也称为主线程;
  2. 通过t.start()创建的新的线程

通过右键运行main方法,其实是idea对应的进程,创建了一个新的Java进程,这个Java进程来执行咱们自己写的代码,这个Java进程里就有两个线程,一个是main线程,另一个是t线程~

调整代码,具体仔细看一下,体会一下:“每个线程都是一个独立的执行流~”;

public class MyThread extends Thread {//继承:创建一个类MyThread,继承标准库的Thread@Overridepublic void run(){//重写,子类重写父类的方法
//        System.out.println("Hello Word");//死循环while (true){System.out.println("hello  t ---->t线程");}}public static void main(String[] args) {//先创建MyThread实列,t的引用实际上是指向子类的实列Thread t=new MyThread();//启动线程,再进程中搞了另外一个流水线,新的流水线开始并发的执行另外一个逻辑了~t.start();//死循环while (true){System.out.println("hello  main  ---->main线程");}}
}

在上述的代码中,t线程和main线程都写了一个while(true)的死循环,按道理来说,一进入while(true)就会死循环了,但是,实际的代码运行情况却不是这样的~~

截取自运行结果部分示意图~

观看运行结果,显而易见的可以得到:交替打印~,此时看到的效果:hello  t ---->t线程和hello  main  ---->main线程都能打印出来,通过t.start()另外启动了一个执行流,而新的执行流(新的线程)来执行        while (true){System.out.println("hello  t ---->t线程"); },因此这段代码与        while (true){System.out.println("hello  main  ---->main线程"); }看起来在同时执行;

线程是能够交替运行的,但是打印出来的结果肯定是有先后的!!因为两个线程往同样一个控制台上控制,同一个控制台必须得顺序输出~!

通过上述代码的运行结果,我们可以看到这两个线程就算再同时执行,先打印几个hello  t ---->t线程,再打印几个hello  main  ---->main线程…………,如果是单个线程的话,此时就是只能打印其中一个,看不到另外一个!

当然,我们对上述代码的main方法做出简单更改!


public class MyThread extends Thread {//继承:创建一个类MyThread,继承标准库的Thread@Overridepublic void run(){//重写,子类重写父类的方法
//        System.out.println("Hello Word");//死循环while (true){System.out.println("hello  t ---->t线程");}}public static void main(String[] args) {//先创建MyThread实列,t的引用实际上是指向子类的实列Thread t=new MyThread();//启动线程,再进程中搞了另外一个流水线,新的流水线开始并发的执行另外一个逻辑了~//start()会创建新的线程//t.start();//run不好创建新的线程,run是在main线程中执行的t.run();//死循环while (true){System.out.println("hello  main  ---->main线程");}}
}

代码的运行结果为:

此处,代码没有创建其他的线程,两个死循环都在同一个线程中,执行到第一个死循环后,代码就出不来了,第二个死循环就进不去了,因此,代码会一直在打印:hello  t ---->t线程

在MyThread中:

public class MyThread extends Thread {//继承:创建一个类MyThread,继承标准库的Thread@Overridepublic void run(){//重写,子类重写父类的方法
//        System.out.println("Hello Word");//死循环while (true){System.out.println("hello  t ---->t线程");}}
}

run()方法:线程的入口方法;

run()方法不是一个随便的方法,是重写了父类的方法~

这种重写一般就是:功能的扩展

一般这样的重写方法是不需要咱们自己手动调用的,已经有其他代码来调用了~如果我们随便写了run2()方法,这样的方法没有在t.start()中被调用,是无法自动执行的~

t.start()方法:调用操作系统的API,创建新的线程,从而新的线程里调用t.run()方法

上述的代码打印太快,不利于查看,可以加thread.sleep(1000),1000是指1000毫秒等于1秒

sleep是Thread的静态方法(通过类名调用)。(报错的话,抛出异常即可)

当然,sleep(1000)仅之休眠一秒,之后的打印结果也不是严格意义上的交替,每一秒过后,是先打印main线程,还是先打印t线程,都是不确定的,因为多个线程在CPU上调度执行的顺序是不确定的(随机);

线程虽然有优先级,但是,这个优先级对于系统来说,只是“建议”

program---->jdk---->bin---->jconsloe.exe应用程序,使用这个jdk提供的工具,就能够给我们查看出Java进程里的线程详情~~

jconsloe只能分析Java进程,不能识别非Java进程,主注意:idea是用Java写的,jconsloe也是用Java写的(占用两个进程,需要注意区分-----》看名字)

当然,有的同学运行jconsloe发现进程列表是空的,大概率是权限问题,右键----》以管理员方式运行即可~(确保代码在运行中,才能看到~)

上述的代码是:使用继承Thread,重写run()方法的方式来创建线程(使用Thread的run()描述线程的入口)

接下来,我们使用实现Runnable,通过重写run方法的方式来创建线程(使用Runnable的interface来描述线程的入口~)

public class MyRunnable implements Runnable{@Overridepublic void run() {while (true){System.out.println("hello t---->t线程");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) throws InterruptedException {MyRunnable runnable=new MyRunnable();Thread t=new Thread(runnable);t.start();while (true){System.out.println("hello main");Thread.sleep(1000);}}
}

对于上述代码的运行结果,大家可自行尝试(交替打印)

3.继承Thread,使用匿名内部类(内部类:定义在类里面的类)

public class Main1 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(){@Overridepublic void run(){while (true){System.out.println("hello t---->t线程");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};t.start();while (true){System.out.println("hello main---->main线程");Thread.sleep(1000);}}
}

4.实现Runnable使用匿名内部类

public class Main1 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(){@Overridepublic void run(){while (true){System.out.println("hello t---->t线程");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};t.start();while (true){System.out.println("hello main---->main线程");Thread.sleep(1000);}}
}

需要注意的是:{ }放到哪里,就算针对哪个类创建的匿名内部类

当然,创建线程最推荐的写法:使用lambda表达式!!最简单最直观的写法(前面几种可以不记)

lambda表达式:本质就是一个匿名函数!!(没有名字的函数,这种一般是一次性的),Java里面函数(方法)是无法脱离类的,在Java里面lambda就相当于一个列外!!

lambda表达式的基本写法:()->{ }

()小括号里面放参数,如果只有一个参数()可省略

{ }大括号里面放函数,写各种Java代码,如果只有一行代码,{ }可省略

那么,我们来看一下具体的写法吧~

public class ThreadDemos {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(()->{while (true){System.out.println("hello t---->t线程");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();while (true){System.out.println("hello main---->main线程");Thread.sleep(1000);}}
}

上述的代码即为lambda表达式的写法(强调~)

更多关于lambda表达式的资料,请详见:百度安全验证

相关文章:

Java进行多线程编程?(lambda表达式~)

本文标题:Java进行多线程编程?那么,Java为啥不学学如何进程多进程编程呢??原因在于:Java圈子中不提倡多进程编程~~ 接下来,我们来写一个最为基础/入门的HelloWord程序来感受如何进行多线程~~ J…...

MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本篇文章建议读者结合:MySQL中的索引事务(1)索引----》数据库运行的原理知识面试题~_念君思宁的博客-CSDN博客此时,如果你根据name来查询,查到叶子节点得到的只是主键id,还需要通过主键id去主键的B树里面在…...

【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序

文章目录 ⚽冒泡排序⚾算法步骤🎨算法优化🥎代码实现:🏀冒泡排序的特性总结 🧭快速排序⚽算法思路📌思路一(Hoare版)📌思路二(挖坑法)&#x1f4c…...

小程序的使用

微信小程序开发 外部链接别人的总结查看(超详细保姆式教程) 基础语法 1.数据绑定 1.1 初始化数据 页面.js的data选项中Page({data: {motto: Hello World,id:18} })使用数据 单项数据流:Mustache 语法 a)模板结构中使用双大括号 {{data}} …...

Spring整合tomcat的WebSocket详细逻辑(图解)

主要解决存在的疑问 为什么存在2种spring整合websocket的方式,一种是使用ServerEndpoint注解的方式,一种是使用EnableWebSocket注解的方式,这2种有什么区别和联系?可以共存吗?它们实现的原理是什么?它们的各…...

【笔试强训选择题】Day37.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!! 文章目录 前言一、Day…...

如何使用HTTP代理爬虫,防止对网站造成负面影响

在当今大数据时代,爬虫技术已经成为了获取数据的重要手段之一。但是,由于爬虫程序的高频访问容易对目标网站造成负面影响,如增加服务器负载、影响网站性能等,因此,如何使用HTTP代理爬虫防止对网站造成负面影响成为了一…...

磐基2.0搭建es集群

参考: k8s安装elasticsearch集群 k8s安装elasticsearch集群_k8s部署elasticsearch集群_MasonYyp的博客-CSDN博客1 环境简述搭建es集群需要使用的技术如下:k8s集群、StatefulSet控制器、Service(NodePort)服务、PV、PVC、volumeC…...

Java中IO类扫盲篇

文章目录 一、简介二、字节流与字符流1. 字节流(InputStream、OutputStream)介绍与用法2. 字符流(Reader、Writer)介绍与用法 三、文件操作与目录遍历1. File类的基本使用2. 目录遍历与递归操作 四、序列化与反序列化1. 序列化与反…...

中秋国庆双节将至,企业如何进行软文推广?

节点营销是每个企业都会面临的课题,中秋国庆双节将至,这两个节日不仅是人们消费的高峰期,也是各大企业通过节日营销提高品牌知名度和美誉度的最佳时机,节点营销的方式之一就是软文推广,那么企业应该如何利用双节来进行…...

SpringMvc--CRUD

目录 一.什么是SpringMvc--CRUD 二.前期准备 公共页面跳转(专门用来处理页面跳转) 三.ssm之CRUD后端实现 配置pom.xml 双击mybatis-generator:generate自动生成mapper 编写generatorConfig.xml 项目结构 编写PagerAspect切面类 编写hpjyBiz接口类 编写hpjyBizImpl接…...

数据库去重(MYSQL和ORACLE)

一、数据库中的去重操作(删除数据库中重复记录的SQL语句)主要有三种方法 (1)、rowid方法 (2)、group by 方法 (3)、distinct方法 1、用rowid方法 根据Oracle带的rowid属性&#…...

微服务-kubernetes安装

文章目录 一、前言二、kubernetes2.1、Kubernetes (K8S) 是什么2.1.1、主要特性:2.2.2、传统部署方式:2.2.3、虚拟机部署2.2.4容器部署2.2.5什么时候需要 Kubernetes2.2.6、Kubernetes 集群架构 三、kubernetes安装3.1、主节点需要组件3.1.1、设置对应主…...

stm32f103zet6移植标准库的sdio驱动

sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现,但一是文件结构有点复杂,二是相比于国内正点原子和野火的板子也有点不同,因此还是需要移植下才能使用。当然也可以直接使用正点原子或野火提供的实例,但为了熟…...

为什么vector容器的begin()既可以被iterator 也可以被const_iterator指向?

答:vector容器中的begin()是函数接口,它作为函数,被重载了。 typedef T* iterator; typedef const T* const_iterator; iterator begin();//括号中有隐含形参*this; const_iterator begin() const;//形参为…...

uniapp里textarea多行文本输入限制数量

uniapp里textarea多行文本域实现输入计数 <template><view class"inputs"><textarea class"text1" maxlength50 placeholder请输入... input"sumfontnum"></textarea><text class"text2">{{fontNum}}/…...

真香:Alibaba开源GitHub星标100K微服务架构全彩进阶手册

前言&#xff1a; 微服务架构作为一种高效灵活的应用架构&#xff0c;正在成为企业级应用开发的主流选择。在众多的微服务架构指南中&#xff0c;阿里巴巴开源的GitHub微服务架构全彩进阶手册备受瞩目&#xff0c;其100star更是证明了其在开发者社区中的重要地位。 这本手册汇…...

Mysql--事务

事务 开始之前&#xff0c;让我们先想一个场景&#xff0c;有的时候&#xff0c;为了完成某个工作&#xff0c;需要完成多种sql操作 比如转账 再比如下单 第一步 我的账户余额减少 第二步 商品的库存要减少 第三步 订单表中要新增一项 事务的本质&#xff0c;就是为了把多个操…...

【算法题】小红书2023秋招提前批算法真题解析

文章目录 题目来源T1&#xff1a;5900: 【DP】小红书2023秋招提前批-连续子数组最大和5801: 【二分查找】小红书2023秋招提前批-精华帖子解法1——排序滑动窗口解法2——前缀和 二分查找 5000: 【模拟】小红书2023秋招提前批-小红的数组构造解法——数学 5300: 【哈希表】小红…...

序列到序列学习(seq2seq)

permute(1,0,2)&#xff0c;将batch_size 放在中间state 最后一个时刻&#xff0c;每个层的输出...

LNMP架构拆分实战:从单机到分布式集群的演进与优化

1. 项目概述&#xff1a;从单机LNMP到分布式架构的必然演进如果你正在运维一个基于LNMP&#xff08;Linux, Nginx, MySQL/MariaDB, PHP&#xff09;架构的网站&#xff0c;并且发现随着用户量的增长&#xff0c;网站响应越来越慢&#xff0c;甚至偶尔出现数据库连接失败、页面加…...

百度网盘直链解析工具:三步实现全速下载的终极方案

百度网盘直链解析工具&#xff1a;三步实现全速下载的终极方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘作为国内主流云存储平台&#xff0c;其下载限速问题一直…...

手把手教你用树莓派4B搭建个人服务器(保姆级图文教程,含SSH与远程桌面配置)

树莓派4B打造高性能个人服务器的终极指南 在当今数字化时代&#xff0c;拥有一个24小时在线的个人服务器不再是企业或技术巨头的专利。树莓派4B以其惊人的性价比和低功耗特性&#xff0c;正在重新定义个人服务器的可能性。想象一下&#xff0c;你的书架上安静运行着一台耗电仅5…...

【AI】关于claude code长会话过程中逐渐遗忘给它提供的标准操作规范问题思考

问题 在使用claude code的时候&#xff0c;我发现&#xff0c;我提供了一系列的操作规范&#xff0c;比如代码编译&#xff0c;容器创建&#xff0c;资源初始化等标准化的操作规范&#xff0c;我让它按照规范执行操作。会话前期&#xff0c;它会严格执行&#xff0c;但是会话长…...

工程机械重型车辆检测数据集 YOLO格式

数据集格式&#xff1a;YOLO格式(包含jpg图片以及对应的yolo格式的txt标注文件) 图片预览&#xff1a; 标注例子&#xff1a; 图片数量(jpg文件个数)&#xff1a;6338 标注数量(txt文件个数)&#xff1a;6338 标注类别数&#xff1a;7 标注类别名称:["Bull_dozer"…...

告别‘偏科’模型:用CAST双流架构搞定视频动作识别,兼顾时空理解

时空双流协同&#xff1a;CAST架构如何重塑视频动作识别的平衡之道 视频动作识别正面临一个关键瓶颈——现有模型往往在时空理解上"偏科"。就像人类大脑需要左右半球协同工作才能完整理解世界一样&#xff0c;理想的视频理解模型也需要同时具备敏锐的空间感知和精准的…...

别再只怪MOS管了!BMS过压保护设计,PCB走线才是隐藏的‘刺客’

别再只怪MOS管了&#xff01;BMS过压保护设计&#xff0c;PCB走线才是隐藏的‘刺客’ 在电池管理系统&#xff08;BMS&#xff09;的设计中&#xff0c;过压保护失效往往被简单归咎于MOS管的选型或钳位二极管的设计。然而&#xff0c;一个真实的案例揭示了更深层的问题&#xf…...

君正IConfigTool介绍

IConfigTool 是君正 SDK 里的图形化配置工具&#xff0c;一般路径类似&#xff1a; tools/iconfigtool/IConfigToolApp/IConfigTool它的作用可以理解成&#xff1a; 用图形界面修改君正平台的一些系统/板级配置文件。 君正文档里说明&#xff1a;IConfigTool 是基于 Qt 的 GUI…...

科梁信息冲刺港股:年营收6亿 利润9303万 桑苏明控制41%股权

雷递网 雷建平 5月20日上海科梁信息科技股份有限公司&#xff08;简称&#xff1a;“科梁信息”&#xff09;日前递交招股书&#xff0c;准备在港交所上市。年营收6亿 利润9303万科梁信息成立于2007年&#xff0c;是一家数字能源科技公司&#xff0c;致力于为新型电力系统与高端…...

emacs-which-key替代方案对比:为什么它成为Emacs 30标准功能

emacs-which-key替代方案对比&#xff1a;为什么它成为Emacs 30标准功能 【免费下载链接】emacs-which-key Emacs package that displays available keybindings in popup 项目地址: https://gitcode.com/gh_mirrors/em/emacs-which-key emacs-which-key是一款能够在Ema…...