关于多线程

进程

在了解线程之前,我们要首先了解进程,那么进程是什么呢?
进程,顾名思义,就是进行中的程序,当前正在运行的程序。
当我们同时在运行多个程序的时候,其实,CPU是在一会执行程序1,一会执行程序2,一会执行程序3,CPU在多个程序之间快速的切换执行。

再举个例子,例如迅雷,我们可以同时下载多个文件。一个进程当中,有可能会出现多条执行路径。例如,下载一个文件,我们可以把一个文件的下载从五个起点开始,这样下载速度就快了。

接下来就可以引入线程了,线程就是进程中的内容,线程就是上面所说的所谓的执行路径,也可以叫做控制单元。

总结:
进程:

是一个正在执行的程序;
每一个进程执行都有一个执行顺序;该顺序是一个执行路径,或者叫一个控制单元;
其实,不论QQ或是迅雷,他们只要启动都会在内存空间中分配一片空间,而进程就是用来标记这个空间的,用来封装里面的控制单元。

线程:

线程就是进程中的一个独立的控制单元;
线程在控制着进程的执行;
一个进程中,至少有一个线程;

线程

java VM 启动时会有一个进程叫做java.exe;
该进程中,至少有一个线程,在负责java程序的执行;
而且这个线程运行的代码存在于main方法中;
负责执行代码的就是进程中的一个线程;
该线程称之为主线程;
之前使用的一直都是单线程;

扩展:

更细节剖析虚拟机

但是!我们一直以为,在不使用多线程的时候,我们使用的是单线程运行程序,其实呢?当我们不用一个方法或者对象的时候,会被回收机制自动回收,那么这个回收机制就是一个线程。其实我们一直用的都是多线程,一个是主线程,一个是垃圾回收线程。

创建线程

通过对API的查找,java已经提供了对线程这类事物的描述。就是Thread类。
创建线程的第一种方式:继承Thread类,覆盖run方法。

步骤:
1. 继承Thread类
2. 覆盖run方法;目的:将自定义的代码存储在run方法中,让线程运行
3. 调用线程的start方法;该方法有两个作用:启动线程、调用run方法

ThreadTest

public class ThreadTest extends Thread {
    //继承Thread类

    //覆盖run方法
    public void run() {
        System.out.println("demo run");
    }
}

Test

public class Test {

    public static void main(String[] args) {
        ThreadTest tt = new ThreadTest();//创建好一个线程
        tt.start();//调用start方法
    }

}

多线程执行,其实也是CPU在多个线程之间快速的切换,这个速度是相当快的,所以感觉不出来。就是执行主线程一会,执行A线程一会,执行B线程一会。是多个线程抢劫CPU的使用权。只是表面上的同时执行,并不是实际上的同时执行。

扩展:

曾经有一个病毒,让你的电脑死机,就是抢劫CPU的使用权,让别的程序抢不着,所以就造成了死机。有机会学习一下多核编程,可以高效的提升程序的运行速度。

我们会发现多线程的运行结果打印的数据每一次都不同,因为每个线程都获取cpu的执行权。cpu执行到谁,谁就运行。明确一点,在某一时刻只能有一个程序在运行(多核除外) cpu在作者快速的切换,以达到看上去是同时运行的效果。我们可以把多线程的运行形为抢夺cpu的执行权。这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长时间,目前为止是cpu说了算。

为什么要覆盖run方法呢?

Thread类用于描述线程。
该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是运行run方法。
也就是说Thread类中的run方法,用于存储线程要运行的代码。

如果不使用start方法而直接使用run方法呢?

注意,我们上面提到过,start方法除了调用线程的run方法还有一个作用是启动线程,如果我们不使用start方法,那么就只是创建了一个线程,但是并没有启用,也就是系统会先执行线程A的run方法直到执行完,才会继续执行主线程的代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值