进程和多线程概念理解以及线程的优点
在我们使用计算机的时候我们很经常边听歌边打代码或者干其他的事情,大这里以windows系统来说,在系统的windows任务管理器的进程选项可以看到:
可能会觉得有点抽象难以理解,大家在上面看到的exe程序其实就可以理解成一个“进程”
那么怎么理解“线程”呢,线程可以理解成是在进程中独立运行的一个子任务,最简单的理解就是假如你在玩微信,你可以同时和别人视频和聊天还可以发送文件,这样应该可以理解了,那么多线程到底有什么优点呢?
优点
如果在这里有对于使用“多任务操作系统”的一些经验的话,最简单的就比如我们常使用的windows系列的,都会有这样一个体会:使用多任务操作系统windows之后可以最大限度的利用CPU的空闲时间来去处理其他的任务,CPU在这些任务之间不断的切换,它的速度非常快,这样使用者的感受就是似乎是在同时进行的一样。
在这里做一个简单的图形便于大家理解一下:
单任务环境下:
多任务环境下:
在这个多任务运行环境图也可以看出,CPU在任务一和任务二之间来回的切换,这样任务二就不用等100s之后再运行了,效率就大大提高了,这就是多线程的“异步”
注意
一个进程正在运行的时候至少会有一个线程在运行
简单多线程举例
上面的注意事项说过了,这种情况在java当中当然也是存在的,这些线程就在后台执行,比如我们最常用的public static void main()这个方法的线程就是由JVM创建的,例如:
package test;
public class Test {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
System.out.println(Thread.currentThread().getPriority());
}
}
运行结果:
在这里解释一下,在控制台中输出的main其实就是有一个名叫main的线程在执行main()方法中的代码,在控制台中的main和main方法是没有任何关系的,仅仅就只是名字相同而已
继承Thread类(实现方法)
在java的JDK中其实已经自带了很多对多线程技术的支持了,可以很方便的进行多线程编程,实现多线程编程有两种方式:
1、继承Thread类
2、实现Runnable接口
在这里简单说明一下:首先讲一下Thread类的结构:
public class Thread implements Runnable
在这里也可以看出,Thread类实现了Runnable接口,它们之间其实是多态关系
在使用方式一去实现多线程的时候会发现,由于java单继承的特点所以很不方便,所以呢为了支持多继承,完全就可以实现Runnable接口的方式,在这里呢也同样将方式一举个小栗子:
方法一
假设创建一个名为Demo的java项目:
创建一个包名为MyThread以及一个类名为mythread去直接继承Thread类并且重写一下它的run方法:
现在用另一个类去继承它:
运行结果:
在这里可以看出在mythread.java类中的run方法比较晚执行,在这里也告诉我们:代码运行的结果与执行顺序或者调用顺序是无关的,线程是一个子任务,CPU以不确定的方式(随机)去调用线程中的run方法,所以可以看到是反过来的结果——线程调用的随机性体现
方法二
实现Runnable接口(常用)
运行结果:
在这里强调一句,Thread.java类其实也实现了Runnable接口,在这里也就意味着一点:构造函数Thread(Runnable target) 不光可以传入Runnable 接口的对象,还可以传入一个Thread类的对象,这样做就可以将一个Thread对象中的run()方法交给其他的线程使用了