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

【并发编程】【3】Java线程 创建线程与线程运行

并发编程

3.Java线程

本章内容

  • 创建和运行线程

  • 查看线程

  • 线程 API

  • 线程状态

3.1 创建和运行线程

方法一,直接使用 Thread

// 创建线程对象
Thread t = new Thread() {public void run() {// 要执行的任务}
};
// 启动线程
t.start();

例如:

// 构造方法的参数是给线程指定名字,推荐
Thread t1 = new Thread("t1") {@Override// run 方法内实现了要执行的任务public void run() {log.debug("hello");}
};
t1.start();

输出:

19:19:00 [t1] c.ThreadStarter - hello

请添加图片描述

方法二,使用 Runnable 配合 Thread

把【线程】和【任务】(要执行的代码)分开

  • Thread 代表线程

  • Runnable 可运行的任务(线程要执行的代码)

Runnable runnable = new Runnable() {public void run(){// 要执行的任务}
};
// 创建线程对象
Thread t = new Thread( runnable );
// 启动线程
t.start();

例如:

// 创建任务对象
Runnable task2 = new Runnable() {@Overridepublic void run() {log.debug("hello");}
};
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();

输出:

19:19:00 [t2] c.ThreadStarter - hello

请添加图片描述

Java 8 以后可以使用 lambda 精简代码

// 创建任务对象
Runnable task2 = () -> log.debug("hello");
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();

@FunctionalInterface

Alt+Enter : IDEA中自动简化快捷键

对比:

请添加图片描述

原理之Thread与Runnable的关系

分析 Thread 的源码,理清它与 Runnable 的关系

小结

  • 方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开了

  • 用 Runnable 更容易与线程池等高级 API 配合

  • 用 Runnable 让任务类脱离了 Thread 继承体系,更灵活

  • 组合大于继承

请添加图片描述

方法三,FutureTask配合Thread

FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况

// 创建任务对象
FutureTask<Integer> task3 = new FutureTask<>(() -> {log.debug("hello");return 100;
});
// 参数1 是任务对象; 参数2 是线程名字,推荐
new Thread(task3, "t3").start();
// 主线程阻塞,同步等待 task 执行完毕的结果
Integer result = task3.get();
log.debug("结果是:{}", result);

输出:

19:22:27 [t3] c.ThreadStarter - hello
19:22:27 [main] c.ThreadStarter - 结果是:100

请添加图片描述

3.2 观察多个线程同时运行

主要是理解

交替执行

谁先谁后,不由我们控制,任务调度器控制

单核不建议

请添加图片描述

3.3 查看进程线程的方法

windows

  • 任务管理器可以查看进程和线程数,也可以用来杀死进程

请添加图片描述

  • tasklist 查看进程

请添加图片描述

  • taskkill 杀死进程

taskkill /F /PID 28060

请添加图片描述

linux

  • ps -fe 查看所有进程

  • ps -fT -p 查看某个 进程(PID)的所有线程

  • kill 杀死进程

请添加图片描述

  • top 按大写 H 切换是否显示线程

  • top -H -p 查看某个进程(PID)的所有线程

请添加图片描述

Java

  • jps 命令查看所有 Java 进程

请添加图片描述

  • jstack 查看某个 Java 进程(PID)的所有线程状态

请添加图片描述

Jconsole 来查看某个 Java 进程中线程的运行情况(图形界面)

请添加图片描述

请添加图片描述
请添加图片描述

Jconsole 远程监控配置

  • 需要以如下方式运行你的 java 类
java -Djava.rmi.server.hostname=`ip地址` -Dcom.sun.management.jmxremote -
Dcom.sun.management.jmxremote.port=`连接端口` -Dcom.sun.management.jmxremote.ssl=是否安全连接 -
Dcom.sun.management.jmxremote.authenticate=是否认证 java类

请添加图片描述

  • 修改 /etc/hosts 文件将 127.0.0.1 映射至主机名

如果要认证访问,还需要做如下步骤

  • 复制 jmxremote.password 文件

  • 修改 jmxremote.password 和 jmxremote.access 文件的权限为 600 即文件所有者可读写

  • 连接时填入 controlRole(用户名),R&D(密码)

http://www.lryc.cn/news/8928.html

相关文章:

  • Ambire 最新消息——2023 年 1 月
  • 【kubeflow | 镜像源的解决方法——脚本】
  • function calling convention(函数调用约定)
  • errgroup 原理简析
  • Centos7.6 下 Docker 安装
  • C++11--lambda表达式
  • 四【Spring框架】
  • 树与二叉树 总复习
  • window10安装MySQL数据库
  • 羊了个羊游戏开发教程3:卡牌拾取和消除
  • SHA1详解
  • Go并发介绍及其使用
  • 小米手机屏幕解锁技巧精选
  • 「SDOI2009」HH去散步
  • 用上Visual Studio后,我的世界游戏的构建时间减少了一半
  • 34、基于51单片机锂电池电压电流容量检测仪表LCD液晶显示 原理图PCB程序设计
  • 【Java基础】泛型(一)-基础使用
  • 学Python不会不知道NumPy计算包吧,带你五分钟看懂NumPy计算包
  • 积水内涝监测——埋入式积水终端设备介绍
  • Kafka的日志同步
  • 【Mybatis源码解析】mapper实例化及执行流程源码分析
  • 分布式文件管理系统(MinIO)
  • Springcloud-配置中心config
  • [项目篇] 音乐播放器开发报告
  • Spring Cloud Alibaba--gateway微服务详解之网关(二)
  • Zynq非VDMA方案实现视频3帧缓存输出,无需SDK配置,提供工程源码和技术支持
  • 血液透析过滤芯气密性检测装置中的高精度多段压力控制解决方案
  • PDF加密如何批量解除?快来了解下这个方法
  • C++——哈希4|布隆过滤器
  • python冒号的用法总结