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表达式的资料,请详见:百度安全验证

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

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

相关文章

leetcode:58. 最后一个单词的长度

题目: 函数原型: int lengthOfLastWord(char * s) 解析: 求最后一个单词的长度,我们有两种思路 第一种思路: 逆向求,先设置一个字符串下标index,定位到最后一个单词的最后一个字符。再一个设置长…

微服务-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、设置对应主…

Mybatis传递实体对象只能直接获取,不能使用对象.属性方式获取

mybatis的自动识别参数功能很强大,pojo实体类可以直接写进mapper接口里面,不需要在mapper.xml文件中添加paramType,但是加了可以提高mybatis的效率 不加Param注解,取值的时候直接写属性 //这里是单参数,可以不加param&#xff01…

Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传)

Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传) 前提准备:获取百度网盘的授权码 https://pan.baidu.com/union/doc/al0rwqzzl const fs require(fs); const crypto require(crypto); const path require(pat…

扫地僧万能HTML模板站群:打造高效便捷的网站建设利器

扫地僧万能HTML模板站群是一款功能强大的网站建设工具,以其独特的特点和卓越的性能在网络开发领域广受赞誉。本文将介绍扫地僧万能HTML模板站群的几大特点,包括模板自动处理、一站管理、泛站独立、多套模板、蜘蛛统计、超强自定义、超强负载、简单高效、…

Achronix与您相约“2023全球AI芯片峰会”

2023全球AI芯片峰会(GACS 2023)将于9月14-15日在深圳市深圳湾万丽酒店举行。峰会由智一科技旗下芯东西联合智猩猩(智东西公开课全新品牌)联合发起主办,以「AI大时代 逐鹿芯世界」为主题。 届时,Achronix将…

【docker快速部署微服务若依管理系统(RuoYi-Cloud)】

工作原因,需要一个比较完整的开源项目测试本公司产品。偶然发现RuoYi-Cloud非常适合,它有足够多的中间件,而且官方提供docker安装,但我本人在安装过程中遇到了很多坑,在这里记录一下防止下次会再次遇到。 项目地址 ht…

表单引擎的自定义控件的概念与设计

基本概念 概述 控件的定义:用于展示或者采集数据的表单元素,称为控件,比如:文本框、下拉框、单选按钮、从表等.自定义控件:表单引擎提供的基础控件之外的控件称为自定义控件, 这些控件由开发人员自己定义,比如&#…

导入jdk源码并进行使用

jdk下载地址 JDK1.8源码下载地址 idea打开jdk项目 打开项目结构,进入SDK这一栏,选择一个使用的jdk,选择jdk的类路径 将类路径进行删除,并且添加我们自己下载的jdk中的src文件夹到类路径

Nodejs+vue+mysql网上药店购药系统 9h2k5

本毕业设计的内容是设计并且实现一个基于vue.js框架的空巢老人购药系统。采用MYSQL为数据库开发平台,nodejs语言,网络信息服务作为应用服务器。空巢老人购药系统的功能已基本实现,主要用户、家属、养生知识、药品信息、身体信息等。 论文主要…

海外ASO优化之如何优化游戏应用

如果我们发布了一款手机游戏或者管理了一款手机游戏,那么需要确保我们的手机游戏对合适的人可见,目的是增加应用的下载量。 1、优化游戏元数据的关键词。 Apple和Google在应用商店中为我们提供有限的空间,来描述手机游戏及其优势。我们需要使…

安防监控/视频汇聚/云存储/AI视频智能算法引擎系统:遛狗检测算法详解

根据最新修订发布的《中华人民共和国动物防疫法》规定:遛狗不栓绳,养狗不办证、未定期接种疫苗等行为都是违法行为。作为一个合格的“铲屎官"出门遛狗一定要牵好狗绳,保护他人和爱犬的安全。但就算法律明文规定,还是有很多人…

Android SDK 上手指南||第十一章 虚拟与物理设备

第十一章 虚拟与物理设备 在之前的文章里,大家已经了解了Android项目当中的基本元素、接触了用户界面的设计以及数据存储方案。接下来,我们将一同探索如何在物理及虚拟设备上运行自己的应用程序并与之互动。在系列文章的下一篇中,我们将分步…

SQL函数

函数 字符串函数数值函数日期函数流程函数 字符串函数 常用函数: 函数功能CONCAT(s1, s2, …, sn)字符串拼接,将s1, s2, …, sn拼接成一个字符串LOWER(str)将字符串全部转为小写UPPER(str)将字符串全部转为大写LPAD(str, n, pad)左填充,用…

【Unity3D赛车游戏优化篇】新【八】汽车实现镜头的流畅跟随,以及不同角度的切换

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

【自动化测试】之PO模式介绍及案例

目录 概念 PO三层模式: 1. 构建基础的 BasePage 对象层 2. 构建首页的 Page 层(操作层) 3.构建业务层 常用断言方法: 4. 构建用例集,执行文件,输出自动化测试报告 测试报告模板 概念 PO&#xff08…

webhook--详解(gitee 推送)

一、简介 webhook 是一种基于 HTTP 的回调函数,可在 2 个应用编程接口(API)之间实现轻量级的事件驱动通信。是一种新型的前后端交互方式,一种对客户端-服务器模式的逆转,在传统方法中,客户端从服务器请求数…

Vue3---uni-app--高德地图引用BUG

先给报错信息:module libs/map//libs/map_min.js is not defined, require args is /libs/map_min.js 查看我引用方法: 本人查阅资料发现 是 require 使用的是 commonJS方式引用说这个适配Vue2可我项目是Vue3应该使用ES6语法糖 然后我有跑了项目发现BU…

Excel数学、工程和科学计算插件:FORMULADESK Studio

如果 Excel 是您的武器 - 让我们磨砺您的剑!为整天使用 Excel 的人们提供创新的 Excel 加载项,你需要这个 FORMULADESK Studio。。。 Excel 插件为任何使用 Excel 执行数学、工程和科学计算的人提供了必备工具。 * 将公式视为真正的数学方程 * 为您的公…

接口自动化测试总结

一、什么项目适合做自动化测试? 软件需求变动不频繁 测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程&#x…