黑马程序员--04.多线程--01.【线程的基本概念】【线程的创建方式】
来源:互联网 发布:删除所有表中的数据 编辑:程序博客网 时间:2024/05/11 18:56
多线程--1
线程的基本概念 线程的创建方式
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. 多线程的基本相关概念
1). 相关概念
(1). 进程
[1]. 进程:正在运行中的程序 ---简称:进程(进行中的程序)
[2]. 一个进程可能出现多条执行路径,这叫多线程。
(2). 线程
[1]. 线程就是进程中的一个独立控制单元
线程在控制着进程的执行
[2]. 线程的别名:一个线程也叫一个控制单元
控制单元的名字更为贴切,因为表示程序运行的一个流程
[3]. 一个进程至少有一个线程
[4]. JVM启动的时候,会产生一个进程java.exe与其对应。
(3). 主线程
[1]. 主线程:进程java.exe中至少有一个线程负责Java程序的运行,这个线程就是主线程
[2]. 主线程运行代码的存放位置:存放在main函数中
(4). JVM的多线程启动 (很多书上笼统地说成是单线程)
JVM启动之后,java.exe进程被创建,实际上是有两个线程存在于java.exe这个进程中,主线程和垃圾回收线程。
[1]. 主线程的作用:执行应用程序中的main函数中的代码
[2]. 垃圾回收线程的作用:负责清理主线程运行过程中在堆内存中产生的垃圾对象。
[3]. 垃圾回收线程存在的合理性:
如果没有垃圾回收线程,主线程运行的过程中,会不断地在内存中产生垃圾对象。当垃圾对象在堆内存中多到主线程无法继续运行的时候,主线程就会停下来,清理垃圾对象。清理完垃圾对象,再继续执行主线程中的代码。给用户的感觉就是程序运行一段时间,停下来不动,过一会继续运行。
(5). 线程、进程、OS和JVM的关系
[1]. 线程存在于进程中,进程由OS创建
[2]. OS先创建进程,创建完进程之后,再创建进程中的线程
[3]. 线程不是人为通过JVM创建的。JVM是调用底层操作系统的功能来创建线程的。
【结论】进程和线程都是由本地操作系统OS创建的。而JVM仅仅是起到调用OS中相应功能的作用
2. 创建线程之一:继承Thread类
1). Thread类
(1). Thread类相关概念
[1]. Thread类描述的客观事物
{1}. JVM创建线程依赖于Windows/Linux。JVM要调用这些OS的内容方可完成线程的创建。Java将处理上述事情封装成一个类,这个类就是Thread类。
{2}. Thread类是程序中执行线程的类。
[2]. Thread类存在的位置
Thread类存在于java.lang这个包中。是系统自动导入的包
(2). 创建线程的第一种方式:创建Thread类的子类
[1]. 通过创建Thread类的子类来创建并启动线程的步骤:
【step 1】继承Thread类,创建Thread类的子类
【step 2】重写Thread子类中的run方法
Thread类中的run方法的源码:
public void run() {
if (target !=null) {
target.run();// target是Runnable接口的引用变量
}
}
重写Thread类的run方法应该注意的事项: 由于父类Thread的run没有抛出异常,所以如果子类的run方法要处理异常,只能try不能抛
【step 3】在主线程中,调用Thread类的子类对象的start()方法来启动线程
[2]. start()方法的两个作用
{1}. 启动线程执行
{2}. 使得JVM调用run()方法
[3]. start()方法的源码
public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); start0(); if (stopBeforeStart) { stop0(throwableFromStop); }}private native void start0();//本地化方法
(3). 分析多线程案例的执行过程
/** * 定义继承Thread类的子类TDemo */class TDemo extends Thread{ public void run(){ for(int i=0; i<10; i++){ System.out.println("Demo Run--"+i); } }} public class TDemoTest{ public static void main(String[] args){ TDemotD =new TDemo(); //创建线程类对象---实际上是程序的另一个控制单元 tD.start(); //启动线程类 for(int i=0; i<10; i++){ System.out.println("Hello World--"+i); } }}
运行结果以及图例
[1]. 流程分析:
{1}. 主线程运行到TDemo tD =new TDemo();的时候,创建了一个新的控制单元/线程 tD
{2}. 接着主线程运行tD.start();开启了刚才创建的进程控制单元 tD
{3}. 这时候:这个java.exe有两个进程在执行各自路径的代码:主线程和线程tD
主线程打印 Hello World
自定义线程 tD 打印 Demo Run
[2]. 交替打印的原因:
由于CPU(单核) 仅仅是一个时刻只能执行一个进程,但是,当一个进程有多个控制单元的时候,CPU会进行快速切换,看起来是同时运行。
(4). 多线程执行的特点
[1]. 程序/进程结束的条件:
进程/程序中的所有前台线程全部执行完毕,进程/线程才会结束。
[2]. 多线程的随机性:多线程的执行可以看成抢夺CPU的执行权
这就会导致,每次运行,哪个线程抢到CPU的执行权是不一定的,谁先抢到,谁就执行。但是这个线程被CPU执行多长时间是未知的,这个是由CPU决定的。
这样,每次运行多线程的程序的运行结果是不一样的。
[3]. 主线程和自定义线程运行的代码:
{1}. 主线程运行定义在main方法中的代码
{2}. 自定义线程运行的是Thread或者其子类中run ()方法的代码
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
- 黑马程序员--04.多线程--01.【线程的基本概念】【线程的创建方式】
- 黑马程序员——多线程--线程的创建方式和线程安全的简单介绍
- 黑马程序员——多线程—创建线程的3种方式
- 黑马程序员《多线程(一创建线程的两种方式)》
- 黑马程序员_笔记_多线程(创建线程的第二种方式:实现Runable接口)
- 黑马程序员-创建线程方式
- 黑马程序员:创建线程的两种方式
- 黑马程序员_java创建线程的两种方式
- 黑马程序员—创建线程的二种方式
- 黑马程序员:创建线程的两种方式
- 黑马程序员_创建线程的两种方式
- 黑马程序员--04.多线程--03.【创建线程两种方法的对比】【多线程卖票案例设计】
- 黑马程序员-多线程--线程间的通信
- 黑马程序员--线程池的创建
- 多线程 创建线程的两种方式
- 多线程-创建线程的三种方式
- java多线程---线程的创建方式
- 【多线程】创建线程的三种方式
- think in java填充容器(事例简述)
- SQL SERVER 2005视图、索引、存储过程、触发器、游标及事务名词解释
- hdu 1455 Sticks(经典搜索)
- ds
- 为学Linux,我看了这些书
- 黑马程序员--04.多线程--01.【线程的基本概念】【线程的创建方式】
- mysql笔记集锦4
- 浅析网站内容是用户体验的决定性因
- Android UI ExpandableListView实现扩展列表
- dynamic类型,.net命名参数,可选参数列表
- POJ 3080 Blue Jeans 暴力枚举+KMP
- 本地数据库通过MySQl-Font导入到某一连接地址的数据库中
- mysql笔记集锦4.2
- 用单链表实现学生信息管理系统