黑马程序员--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();// targetRunnable接口的引用变量

        }

}

重写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学习型技术博客、期待与您交流! ------------

 

原创粉丝点击