线程基础01

1.程序 进程 线程

  • 程序(program):是为完成的特定任务,用某种语言编写的一组指令的集合。简单来说,就是我们写的代码。

  • 进程:

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

  • 线程:

    1. 线程是由进程创建的,是进程的一个实体
    2. 一个进程可以有多个线程,比如:用迅雷同时下载多个文件
  • 其他相关概念:

    1. 单线程:同一时刻,只允许执行一个线程
    2. 多线程:同一时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口;一个迅雷进程,可以同时下载多个文件。
    3. 并发:同一时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单地说,单核cpu实现的多任务就是并发

    1. 并行:同一时刻,多个任务同时执行。多核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中线程来使用有两种方法:

  1. 继承Thread类,重写run方法
  2. 实现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的更多相关文章

  1. C#多线程开发-线程基础 01

    最近由于工作的需要,一直在使用C#的多线程进行开发,其中也遇到了很多问题,但也都解决了.后来发觉自己对于线程的知识和运用不是很熟悉,所以将利用几篇文章来系统性的学习汇总下C#中的多线程开发. 线程基础 ...

  2. javascript基础01

    javascript基础01 Javascript能做些什么? 给予页面灵魂,让页面可以动起来,包括动态的数据,动态的标签,动态的样式等等. 如实现到轮播图.拖拽.放大镜等,而动态的数据就好比不像没有 ...

  3. Androd核心基础01

    Androd核心基础01包含的主要内容如下 Android版本简介 Android体系结构 JVM和DVM的区别 常见adb命令操作 Android工程目录结构 点击事件的四种形式 电话拨号器Demo ...

  4. java基础学习05(面向对象基础01)

    面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...

  5. Linux基础01 学会使用命令帮助

    Linux基础01 学会使用命令帮助 概述 在linux终端,面对命令不知道怎么用,或不记得命令的拼写及参数时,我们需要求助于系统的帮助文档:linux系统内置的帮助文档很详细,通常能解决我们的问题, ...

  6. Qt之线程基础

    何为线程 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据计算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例 ...

  7. Android多线程研究(1)——线程基础及源代码剖析

    从今天起我们来看一下Android中的多线程的知识,Android入门easy,可是要完毕一个完好的产品却不easy,让我们从线程開始一步步深入Android内部. 一.线程基础回想 package ...

  8. JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)

    实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...

  9. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

随机推荐

  1. JavaScript做简单的购物车效果(增、删、改、查、克隆)

    比如有时候遇到下面这种情况,点击加入购物车,然后在上方的购物车中动态的添加商品以及商品的信息,我们就可以通过JavaScript实现简单的这些操作. 首先我们需要在html文档中,通过css对页面的布 ...

  2. 机械硬盘和ssd固态硬盘的原理对比分析

    固态硬盘和机械硬盘的区别 机械硬盘 磁头是不是直接和盘片接触的呢 磁盘中有几个盘片 机械硬盘的工作原理 固态硬盘的寻址方式 SMR叠瓦式真的比PMR优秀吗 固态硬盘 主控芯片 闪存颗粒 缓存单元 固态 ...

  3. sql server 跨IP库更新表字段(OPENDATASOURCE 、update)

    --跨ip库更新表字段 update uat set goodsType=dev.goodsType from OPENDATASOURCE('SQLOLEDB','Data Source=127.0 ...

  4. Docker Buildx使用教程:使用Buildx构建多平台镜像

    写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker ...

  5. 漫谈客户端存储技术之Cookie篇

    Cookie 说到Cookie,不管作为前端开发人员还是后端开发人员并不陌生,作为一种最古老.最稳定的客户端存储形式,即便是在当下各种新的客户端存储技术层出不穷的时代,它仍旧有其一席之位.Cookie ...

  6. 基于POM---UI测试框架

    为什么会出现这个半自动化UI测试框架 我进入公司的前一个月从事的手工测试,为了提高自己的测试效率在工作时间之外写了一个半自动化的UI测试(害怕手工测试做久了,忘记自己还学过软件开发), 为什么我把它叫 ...

  7. 常用的Linux命令和Git的必要配置

    常用的Linux命令平时一定要多使用这些基础的命令! 1.cd : 改变目录. 2.cd . . 回退到上一个目录,直接cd进入默认目录 3.pwd : 显示当前所在的目录路径. 4.ls(ll): ...

  8. 什么?让每一个开源项目更安全?啊?还有IDE工具?难道是它?

    背景 入编程界6年来,大大小小的安全漏洞是真滴听了不少,xxx通过日志入侵了,xxxx通过请求入侵了,等等等等. 近期fastJson又报安全漏洞,敢巧自己又"被"跳槽到了新公司, ...

  9. iOS中 Tagged Pointer 技术

    前言: ​ 从64位开始,iOS引入了Tagged Pointer技术,用于优化NSNumber.NSDate.NSString等小对象的存储. Tagged Pointer主要为了解决两个问题: 内 ...

  10. ubu18时间设置

    ubu18 日期设置 1.date date 命令修改系统时间,重启失效,需要写入硬件Bios #查看日期 date #修改日期 date -s "2022-01-14 09:32:00&q ...