程序(program)
是为完成制定任务,用某种语言编写的一组指令的集合.简单的话说:就是我们写的代码.
进程
1.进程是指进行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间,当我们使用迅雷,又启动了一个进程,操作系统将为迅雷分配新的内存空间.
2、进程是程序的一次执经过程,或是正在进行的一个程序,是动态过程,有它自身的产生,存在和消亡的过程.
线程
1.线程由进程/线程创建,是进程的一个实体.
2.一个进程可以拥有多个线程.
i.单线程:同一个时刻,只允许执行一个线程
ii.多线程:同一个时刻,可以执行多个线程,比如,一个QQ进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件.
3.并发:同一时刻,两个任务发替执行,造成一种"貌似同时"的销觉,简单的说,单核CPU实现的多任务是并发
4.并行:同一个时刻,多个任务同时执行,多核CPU可以实现并行.
创建线程的两种方式
在iava中线程使用有两种方法.
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法.
使用这两个线程类
示意图:
实例并使用JConsole查看线程:
tips:控制台中输入jconsole
为什么是start()?
相信大家对于使用start方法来启动一个新线程持怀疑态度,因为我们重写了run方法,却调用了start方法,那么我们就来看看源码,打破疑虑.
先来看看调用run方法
结果是
通过我们上面使用jconsole知道了main是主线程的线程名,可见并没有启动一个新线程.
再来看看调用了start方法
结果是
可见启动了一个新线程,那么便可证明启动新线程要调用的是start方法.
看下源代码
结论:用start()方法才能实现多线程,只是单纯的调用run方法相当于在当前调度线程中执行,并没有多线程。
start0是本地方法,是JVM调度,底尾是c/c++实现.
真正实现多成程的效果,是start0,而不是run.
实现Runnable接口
1.java是单继承的,在某些情况下一个类可能已经承了某个父类,这时再用继承Thread类方法来创建线程显然不可能了.
2.java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建线程.
3.底层使用设计模式[静态代理模式]
思路模拟: