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中
..