IO流-进程和线程、开启线程的三种方式--java进阶day15

1.进程

进程就是正在执行的运用程序,或者程序正在执行的过程

2.进程的三个特点

1.独立性:每一个运行的程序都有独立的空间,相互之间不能随意访问

2.动态性:程序在运行时就会存在,结束了则会消失

在聊并发性之前,我们需要了解并行和并发

3.并行和并发

1.并行:同一时刻,多个指令同时执行

2.并发:同一时刻,多个指令交替执行

3.并发性:任何进程都可以与其他进程一起并发执行(交替执行)

但是日常生活中,我们可能都觉得程序是并行执行,比如:边打游戏边听歌,但其实,这是并发操作

如图,cpu会在多个进程之间进行交替进行,速度非常快,让我们感觉是在并行执行,实际是并发执行

总结

4.线程

线程就是进程执行时的任务,进程可以一次执行多个任务,每个任务就是一个线程

5.多线程的意义

一个线程,只能在一个cpu上进行处理

java程序也是一个进程,假设有两个任务,如果我们写的是单线程,尽管cpu再多,一次只能执行一个任务,另外一个任务就无法放到剩余的cpu进行处理

反之,我们写多线程,一次可以执行多个任务,那么两个任务都可以在cpu上运行

现在的电脑cpu越来越多,但是再多也不可能比要执行的线程多,所以,程序的运行不是单纯的并行或者并发,而是两者皆有

如图,蓝色线是线程,红色线是在cpu上运行,4条红线会快速的随机运行线程

多线程的意义:重点在于同时处理多个任务,比如边打游戏边下游戏资源

6.java开启线程的三种方法

[1]继承Thread类

如图,我们发现控制台中执行的结果都是run方法的逻辑

细节:调用start方法开启线程,会自动调用run方法执行

注意事项:只有调用了start方法,才是开启了新的线程

有的人可能认为调用run方法也可以执行逻辑,但是需要注意,调用run方法只是单纯的执行了逻辑,而调用start则是开启了线程执行run的逻辑,两者是有本质区别的

java程序默认是多线程

主线程很好理解,就是我们写代码逻辑的线程,而垃圾回收线程,则是对垃圾进行清理的线程

如图,当demo类被视为垃圾进行回收后,会自动调用finalize方法

我们写了50万个demo类,控制台出现了finalize方法的逻辑,我们并没有开启垃圾回收线程,但是现在却有人帮我们监测垃圾,这条线程就是垃圾回收线程

如图,我们自己的线程和主线程之间进行交替执行

[2]实现Runnable接口

假如我们写的类已经继承了别的父类,那么就无法继续继承Thread,此时就可以选择实现Runnable接口

前三步和之前一样

第四步的线程任务资源就是指我们自己写的类

当我们创建出线程任务资源后,发现无法调用start方法,其一,我们自己写的类没有start方法,其二,Runnable接口也没有start方法

Thread类里有一个构造方法,可以传入Runnable的实现类

此时,就要用到第五步,创建线程对象,将资源传入

我们再写一个主线程,方便观察线程交替执行


[3]实现Callable接口

前面两种线程都没用返回值,而Callable接口开启的线程带有返回值

前三步和之前几乎相同,但在实现Callable接口时,会要求指定泛型,我们的返回值是什么类型,泛型就指定什么类型,在call方法里写好逻辑,再使用return返回即可

线程任务资源即为我们自己写的类,不能直接调用start方法,原因和之前的一样

把线程任务资源放入线程对象也不行,因为线程对象构造方法里根本没有Callable实现类

我们需要使用一个媒介--FutureTask,以此来建立和Thread的联系

FutureTask实现了Runnable接口,所以本质也是Runnable实现类,因此可以放入Thread中


..

最后使用线程对象调用start开启线程,使用 线程任务对象 接收返回值

必须等线程开启之后,才能去接收返回值,否则线程未开,没有返回值产生,线程任务对象又一直等待结果,会导致程序一直运行,无法结束 下图为错误示范

如果想要开启两个线程,需要创建两次FutureTask对象,两条线程对应两个结果,一个FutureTask就是一个结果

如果是两个线程对象,共用一个FutureTask对象,并没有开启两条线程,只是把同一个结果返回了两次

posted @ 2025-05-05 14:18  直実  阅读(23)  评论(0)    收藏  举报