线程基础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. JS:Array

    js有五种基本数据类型:string,number,boolean,null,undefined 一种引用类型,包括:1.Object类型:2.Function类型:3.Array类型:4.RegEx ...

  2. SAP Grid control( ALV Grid 列表 自定义 按钮)

    ALV 列表和按钮 效果 源代码 PROGRAM bcalvc_tb_menu_with_def_but. *&&&&&&&&& ...

  3. 搭建zabbix及报错处理

    搭建ZABBIX服务器准备工作 1.需要服务器是LAMP 或 LNMP 环境 2.主机名和IP要写在HOST文件里 3.iptables 和 selinux 必须关闭 一.先用最简单的方式搭建lamp ...

  4. PTA(BasicLevel)-1018 锤子剪刀布

    一.问题定义 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如下:         剪刀 > 布, 锤子 > 剪刀, 布 > 锤子 现给出两人的交 ...

  5. HelloWord程序代码的编写和HelloWord程序的编译运行

    1.新建文件夹,存放代码 2.新建一个Java文件 文件后缀名.java(Hello.java) 3.编写代码public class Hello{public static void main(St ...

  6. GitHub相关资料&&可以参加的开源项目

    GitHub相关的资料 有不懂的地方时可以看GitHub Docs. GitHub tutorial GitHub glossary GitHub的字典,可以看到里面特定的概念. All about ...

  7. 002面试题_Switch...case的数据

    1.byte 2.short 3.int 4.char 5.String 6.枚举

  8. NOI / 2.5基本算法之搜索-6044:鸣人和佐助详解

    总时间限制: 1000ms 内存限制: 65536kB 题目 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到, ...

  9. AtCoder Beginner Contest 247 E - Max Min // 容斥原理

    原题链接:E - Max Min (atcoder.jp) 题意: 给定一个数组,求满足最大值为X且最小值为Y的区间个数. 思路:容斥原理 因为必须要包含端点,直接求是不容易的.因此考虑去求不一定包含 ...

  10. super与this关键字图解和java继承的三个特点

    java继承的三个特点 java语言是单继承的 一个类的直接父类只能有一个 class A{} class B extends A{}//正确 class C{} class D extends A, ...