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

Java重修笔记 第五十四天 坦克大战(四)多线程基础

  • 线程

       当点击运行按钮运行程序时,就相当于启动了一个进程,虚拟机进入 mian 方法后会开启一个名为 mian 的主线程,main 方法体中创建一个线程对象,调用该线程对象的 start 方法又创建一个子线程,子线程的启动并不会阻塞主线程剩余代码继续执行

        主线程结束后并不会影响进程的结束,只有当该进程下的所有线程全部结束后,该进程才会结束。

  • Jconsole 工具的使用

        在程序运行时,打开下面的 Terminal 终端显示框,输入 Jconsole 便可打开监视和管理控制台,其中便可找到对应线程查看状态。

        若无法看到本地线程,可参考以下文章解决:

运行jconsole无法看到本地进程_jconsole找不到本地进程-CSDN博客文章浏览阅读1.2k次,点赞3次,收藏3次。设置完全控制_jconsole找不到本地进程https://blog.csdn.net/weixin_49107940/article/details/127963204

  • 关于 start 方法

        只有调用线程对象 start 方法才能创建出一个子线程,子线程不影响主线程的执行,如果只调用线程对象的 run 方法,那就不会创建新线程,还是在主线程中运行,阻塞主线程直到 run 方法执行完毕。

        start 方法底层会调用 start0 方法,此方法才真正实现多线程的效果。当然 start0 并不会直接创建线程,而是将线程的状态改变为“可运行状态”,具体什么时候执行,取决于CPU统一调度。

  • 创建线程
1. 通过继承 Thread 类来创建线程
        (1)让对象类继承 Thread 类,而 Thread 类实现了 Runnable 接口,该类就可以当做一个线程使用
        (2)重写 Runnable 接口里的 run 方法,在方法体中写上自己的业务逻辑
        (3)创建线程类对象,调用线程类对象的 start 方法来启动该线程,启动子线程后并不会阻塞主线程下面的代码继续执行
public class Thread01 {public static void main(String[] args) {Cat cat = new Cat();cat.start();try {for (int i = 0; i < 10; i++) {Thread.sleep(1000);System.out.println("主线程输出第" + i + "次");}} catch (InterruptedException e) {System.out.println(e.getMessage());}}
}class Cat extends Thread {private static int count;@Overridepublic void run() {do {count++;System.out.println("第" + count + "次输出, 线程名为: " + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {System.out.println(e.getMessage());}} while (count != 80);}
}
2. 通过实现 Runnable 接口来创建线程
        (1)让对象类实现 Runnable 接口
        (2)重写 Runnable 接口里的 run 方法,在方法体中写上自己的业务逻辑
        (3)创建线程类对象,然后创建 Thread 类对象,把线程类对象作为参数放到 Thread 类的构造方法中(静态代理模式)
        (4)调用 Thread 类对象的 start 方法
public class Thread02 {public static void main(String[] args) {new Thread(new Dog()).start();}
}class Dog implements Runnable {public static int count = 0;@Overridepublic void run() {try {do {count++;System.out.println("第" + count + "次输出, 线程名为: " + Thread.currentThread().getName());Thread.sleep(1000);} while (count < 80);} catch (InterruptedException e) {System.out.println(e.getMessage());}}
}

  • 线程退出-通知方式

        简单来说就是在线程类中设置一个变量,并向外暴露修改方法,通过线程对象的 set 方法来操作这个变量,以实现手动控制 run 方法退出这个子线程。

public class ThreadExit_ {public static void main(String[] args) {MyThread04 myThread04 = new MyThread04();myThread04.start();// 主线程休眠 10 秒后退出子线程try {Thread.sleep(1000 * 10);} catch (InterruptedException e) {e.printStackTrace();}myThread04.setLoop(false);}
}class MyThread04 extends Thread {private boolean loop = true;private int count = 0;public boolean isLoop() {return loop;}public void setLoop(boolean loop) {this.loop = loop;}@Overridepublic void run() {try {while (loop) {if (count++ == 1000) {break;}Thread.sleep(100);System.out.println(Thread.currentThread().getName() + "运行中... " + count);}} catch (InterruptedException e) {e.printStackTrace();}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTTPX 与 AIOHTTP 与 Requests:选择哪个?
  • DBeaver连接数据库报连接错误:Public Key Retrieval is not allowed
  • 【API Testing and Development with Postman 2nd_001】关于本书
  • Ubuntu搭建conda环境,指令记录
  • 算法学习攻略总结 : 入门至进阶,通关之路指南
  • JVM虚拟机 - 基础篇
  • Numpy中数组元素的获取
  • springboot3 集成elasticsearch(es)客户端(高亮查询)
  • 走进低代码报表开发(二):高效报表设计新利器
  • linux 中gitee配置
  • 使用patch命令移除sts中的一个container
  • 个人学习笔记7-2:动手学深度学习pytorch版-李沐
  • 基于Spring Boot的小区物业管理系统
  • 深入剖析 Java 中的 AbstractQueuedSynchronizer(AQS)
  • 苹果宣布iOS 18正式版9月17日推送:支持27款iPhone升级
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • const let
  • css的样式优先级
  • HTTP中的ETag在移动客户端的应用
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java面向对象及其三大特征
  • nginx 负载服务器优化
  • VuePress 静态网站生成
  • 创建一种深思熟虑的文化
  • 对象管理器(defineProperty)学习笔记
  • 基于游标的分页接口实现
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 深度学习中的信息论知识详解
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 通过git安装npm私有模块
  • 微信小程序填坑清单
  • 微信小程序--------语音识别(前端自己也能玩)
  • 物联网链路协议
  • 学习HTTP相关知识笔记
  • 学习Vue.js的五个小例子
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ## 基础知识
  • #define与typedef区别
  • (~_~)
  • (13)DroneCAN 适配器节点(一)
  • (3)llvm ir转换过程
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Note)C++中的继承方式
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)c52学习之旅-点亮LED灯
  • (三十五)大数据实战——Superset可视化平台搭建
  • (转)c++ std::pair 与 std::make
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .a文件和.so文件
  • .bat批处理(二):%0 %1——给批处理脚本传递参数