复学day11

线程/Thread

所谓的程序是指令和数据的有序集合,其本身并没有任何含义,是一个静态的概念;所谓进程则是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。

直观上在操作系统中运行的一个程序就是进程,如游戏、QQ等等,一个进程中可以有多个线程,如视频中同时听声音、看图像。(修改:线程在层次上扩展了多任务的概念:一个程序执行多个任务,通常上我们认为一个任务便是一个线程)。
那么多线程和多进程的区别在哪里呢?答:本质的区别在于每个进程拥有自己的一整套变量,而线程则是共享数据。

ps:很多多线程是模拟出来的,真正的多线程是指有多个CPU(多核);所谓的模拟出的多线程指的是在一个cpu的情况下,切换的很快,给人同时执行的错觉(一个时间点,cpu只能执行一个代码)。所以本部分侧重点在于运行顺序逻辑方面,代码语法相对来说少一点。

可能上述描述偏书面化,简单理解就是一个线程就是多一条途径去执行任务,执行任务的顺序不再单调,且加快了执行速度

img

创建线程

创建线程有三种方式:1、继承Thread类;2、实现Runable接口;3、实现Callable接口(目前阶段接触不多)

关于Thread类实现多线程:

位于java.lang包下,继承Object类、实现Runnable接口

我们在创立线程时,自定义一个线程类继承Thread类,重写run()方法,编写出线程的执行体,继而创建该线程类对象,调用start()方法启动线程。

ps:线程不一定立即执行,cpu安排调度。(该方法已不再推荐,为每个任务单独创建一个线程所付出的代价太大了)

public class Test extends Thread{
    @override
    public void run(){
        //线程体
        for(int i = 0; i < 20; i++){
            System.out.println("新线程");
        }
    }

    public static void main(String[] args){
       //创建线程对象
       Test t1 = new Test();
       t1.start();
   } 
}

关于通过Runnable结构实现多线程:

首先定义一个Runnable接口的实现类,同样的定义run()线程体方法,然后创建该类的实例对象,继而创建Thread类,将实例对象作为Thread的参数,通过调用Thread的start()方法启动多线程。

public class Runtest implements Runnable{
    @override
    public void run(){
        //线程方法体
        ...
    }
    Runtest test = new Runtest();
    new.Thread(p).start();
}

上述两者方法,感觉核心是都是通过覆盖重写run()方法,通过Thread的start()方法执行。不过因为通过继承Thread类来实现多线程是存在单继承的局限性的,所以我们常常选择实现Runnable接口的方式来调用多线程。

警告:不要调用Thread类或Runnable对象的run方法,直接调用run方法只会执行同一个线程中的任务而已,并不会启用新线程,应该调用Thread.start方法。

多线程并发问题

在多线程操作同一资源时便会发生并发问题,后续补充

posted @ 2020-11-23 19:10  何安生  阅读(68)  评论(0)    收藏  举报