day31-线程基础01
线程基础01
1.程序 进程 线程
- 程序(program):是为完成的特定任务,用某种语言编写的一组指令的集合。简单来说,就是我们写的代码。

进程:
- 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷分配新的内存空间。
- 进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程。

线程:
- 线程是由进程创建的,是进程的一个实体
- 一个进程可以有多个线程,比如:用迅雷同时下载多个文件
其他相关概念:
- 单线程:同一时刻,只允许执行一个线程
- 多线程:同一时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口;一个迅雷进程,可以同时下载多个文件。
- 并发:同一时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单地说,单核cpu实现的多任务就是并发

- 并行:同一时刻,多个任务同时执行。多核cpu可以实现并行。在电脑中也可能同时出现并发和并行的状态。

例子:
package li.thread;
public class CpuNum {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
//获取当前的电脑的cpu数量
int cpuNums = runtime.availableProcessors();
System.out.println("当前的CPU数量="+cpuNums);//当前的CPU数量=8
}
}
2.线程的基本使用
- 创建线程的两种方式
在java中线程来使用有两种方法:
- 继承Thread类,重写run方法
- 实现Runnable接口,重写run方法

2.1继承Thread创建线程
例子1:线程应用案例1-继承Thread类
1)请编写程序,开启一个线程,该线程每隔一秒,在控制台输出 “喵喵,我是小猫咪”
2)对上题改进:当输出80次“喵喵,我是小猫咪”时,结束该线程
3)使用JConsole监控线程执行情况,并画出程序示意图
package li.thread;
//演示通过继承Thread类创建线程
public class Thread01 {
public static void main(String[] args) throws InterruptedException {
//创建一个Cat对象,可以当做线程来使用
Cat cat = new Cat();
cat.start();//启动线程
//当main线程启动一个子线程 Thread-0后,主线程不会阻塞,会继续执行
//这时 主线程和子线程是交替执行
System.out.println("主线程继续执行="+Thread.currentThread().getName());//主线程继续执行=main
for (int i = 0; i < 60; i++) {
System.out.println("主线程 i="+i);
//让主线程休眠
Thread.sleep(1000);
}
}
}
//1.当一个类继承了Thread类,该类就可以当做一个线程使用
//2.我们会重写run方法,写上自己的业务代码
//3.run Thread类实现了Runnable接口的run方法
/*
@Override
public void run() {
if (target != null) {
target.run();
}
}
*/
class Cat extends Thread {
@Override
public void run() {//重写run方法,写上自己的业务逻辑
int times = 0;
while (true) {
//该线程每隔1秒,在控制台输出 “喵喵,我是小猫咪”
System.out.println("喵喵,我是小猫咪" + (++times)+" 线程名称="+Thread.currentThread().getName());
//让该线程休眠一秒
try {
Thread.sleep(1000);//单位为毫秒 try-catch快捷键:Ctrl+Alt+T
} catch (InterruptedException e) {
e.printStackTrace();
}
if (times == 80) {
break;//当times到80,退出while,这是线程也就退出了
}
}
}
}
3)使用JConsole监控线程执行情况,并画出程序示意图:
如下,在控制台点击run,运行程序,在程序运行时,点击Termial

在控制台输入JConsole,回车。

点击本地进程,点击Thread01,点击下方连接按钮:

在弹出窗口中点击不安全的连接按钮:
在窗口中点击“线程”:

可以在左下角的线程小窗口中看到main线程和Thread-0线程在同时进行

等待一段时间,可以看到当run窗口的主线程 i = 60之后,main线程结束
结束前:

结束后:
当线程名称=Thread-0输出到80次时,虽然可以Thread-0还在左下角,但是实际上Thread-0线程已经结束了,整个进程随之结束。

程序示意图:

注意:在多线程编程里面,并不一定说主线程结束了,整个进行就结束了,等所有线程都结束了,进程才会结束。
2.2为什么是start?
在2.1的例子中,主方法中定义了cat对象,该对象调用了start方法,start方法会去启动一个线程,最终会执行Cat 类的run方法。
思考一个问题:既然最终都是要调用run方法,为什么cat对象还要通过start方法对调用run呢?为什么不直接调用?
答案: 首先通过 对象.run() 方法 可以执行方法,但是不是使用的多线程的方式,就是一个普通的方法,没有真正地启动一个线程。即这时候把run方法执行完毕,才能执行主方法剩下的语句。
如下图:将cat.start();改为cat.run();之后的运行结果:
在run方法执行完之后才执行主方法剩下的语句

那么在调用start方法时,整个过程到底是什么样子的?
点击start()方法:可以在start方法中看到一个start0()方法:

点击start0( )方法:可以看到start0是一个本地方法,由 JVM调用,底层是c/c++实现。

再看看run()方法的源码:可以看到run方法只是简单的调用了实现类的run,没有进行任何的多线程处理。

换而言之,Java中真正实现多线程的效果的是start0方法,而不是run方法

day31-线程基础01的更多相关文章
- C#多线程开发-线程基础 01
最近由于工作的需要,一直在使用C#的多线程进行开发,其中也遇到了很多问题,但也都解决了.后来发觉自己对于线程的知识和运用不是很熟悉,所以将利用几篇文章来系统性的学习汇总下C#中的多线程开发. 线程基础 ...
- javascript基础01
javascript基础01 Javascript能做些什么? 给予页面灵魂,让页面可以动起来,包括动态的数据,动态的标签,动态的样式等等. 如实现到轮播图.拖拽.放大镜等,而动态的数据就好比不像没有 ...
- Androd核心基础01
Androd核心基础01包含的主要内容如下 Android版本简介 Android体系结构 JVM和DVM的区别 常见adb命令操作 Android工程目录结构 点击事件的四种形式 电话拨号器Demo ...
- java基础学习05(面向对象基础01)
面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...
- Linux基础01 学会使用命令帮助
Linux基础01 学会使用命令帮助 概述 在linux终端,面对命令不知道怎么用,或不记得命令的拼写及参数时,我们需要求助于系统的帮助文档:linux系统内置的帮助文档很详细,通常能解决我们的问题, ...
- Qt之线程基础
何为线程 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据计算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例 ...
- Android多线程研究(1)——线程基础及源代码剖析
从今天起我们来看一下Android中的多线程的知识,Android入门easy,可是要完毕一个完好的产品却不easy,让我们从线程開始一步步深入Android内部. 一.线程基础回想 package ...
- JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...
- 【windows核心编程】 第六章 线程基础
Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ① 一个是线程的内核 ...
随机推荐
- word-制作三线表
找一个表格或插入一个表格, 找到 [设计] [新建表格样式] [将格式应用于: 整个表格] 点击"框线设置"按钮,在弹出的下拉菜单中分别选择 [上框线] 和 [下框线],然后分别设 ...
- Python基础学习笔记_02
Python中的运算符 标准算术运算符 加(+) 减(-) 乘(*) 除(/) 整除(//) print(1+1) #加法运算 print(1-1) #减法运算 print(2*4) #乘法运算 pr ...
- Leetcode--Last Stone Weight II
Last Stone Weight II 欢迎关注H寻梦人公众号 You are given an array of integers stones where stones[i] is the we ...
- RPA应用场景-财务报表统计整合
场景概述 财务报表统计整合 所涉系统名称 邮储银行系统 人工操作(时间/次) 3小时 所涉人工数量 1 操作频率 每月 场景流程 1.登录各个区支行系统 2.机器人按照要求,自动复选多项业务参数,导出 ...
- 配置svn,httpd启动报错 Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
查看httpd的状态,发现80端口被占用,因为我的nginx的80端口. systemctl status httpd.service 解决: 把Apache的端口该成别的端口 vi /etc/ht ...
- NC15052 求最值
NC15052 求最值 题目 题目描述 给你一个长为 \(n\) 的序列 \(a\) 定义 \(f(i,j)=(i-j)^2+g(i,j)^2\) \(g\) 是这样的一个函数 求最小的 \(f(i, ...
- Oracle归档日志暴增排查优化
1.ORACLE归档日志介绍 归档日志暴增是oracle比较常见的问题,遇到归档日志暴增,我们该如何排查: 归档日志暴增一般都是应用或者人为引起的 理解归档日志存储的是什么 如何排查归档日志暴增原因 ...
- 输入一个url全过程详解
1. 用户在浏览器中输入url,浏览器接收到url. 2.浏览器接收到这个url之后,会根据这个url会先查看缓存,如果有缓存且没有过期的话直接提供给客户端,完成页面渲染. 3.否则浏览器就会通过DN ...
- markdown练习显示
1.[markdown学习网址1]https://sspai.com/post/25137 2.[markdown学习网址1]https://www.runoob.com/markdown/md-pa ...
- 如何在Excel/WPS表格中批量查询顺丰快递信息?
如何在Excel/WPS表格中批量查询顺丰快递信息? 上期我们讲了如何在Excel/WPS表格中批量查询快递信息(还不知道的小伙伴可以看这里:https://zhuanlan.zhihu.com/p/ ...