线程与进程的概念,以及线程与进程的区别
进程:是一个独立的应用程序,每个进程包含一到多个线程
线程:是指一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行,也可以把它理解为代码运行的上下文,
所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务,通常由操作系统负责多个线程的调度和执行
使用线程可以把占据时间长的的程序中的任务放到后台去处理,程序的运行速度可能更加快,在一些等待的任务实现上如
用户输入,文件读写和网络收发数据等,线程就比较有用了
如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换,更多的线程需要更多的内存空间,所以线程不建议开多,开5个基本就可以
总结:进程是所有线程的集合,每一个线程是进程中的一条执行路径
为什么使用多线程
同一时刻有多条不同的执行路径同时执行
使用多线程的目的就是提高程序效率(不会提高程序性能)
多线程的应用场景
如:使用下载器同时下载多个文件,数据库连接池,分批发送短信等
多线程同步和异步
多线程状态
新建状态:当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码在调用start之前
就绪状态:调用start方法,等待cpu分配执行权
运行状态:当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法.
阻塞状态: 线程运行过程中,可能由于各种原因进入阻塞状态:
1>线程通过调用sleep方法进入睡眠状态;
2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回 到它的调用者;
3>线程试图得到一个锁,而该锁正被其他线程持有;
4>线程在等待某个触发条件;
死亡状态:有两个原因会导致线程死亡:
run方法正常退出而自然死亡,
一个未捕获的异常终止了run方法而使线程猝死。
为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.
多线程的创建方式
第一种继承thread类,重写run、方法
第二种实现runnable接口,重写run方法
第三种使用匿名内部类的方式
使用thread类好还是实现runnable接口好
使用runnable接口好,原因实现了接口还可以继承,继承了类就不能再继承,还有runnable接口的可以放入线程池中,继承的方式无法放入线程池中
启动线程是调用start方法还是调用run方法
开启线程是调用start方法,调用run方法执行实例方法
守护线程与非守护线程
守护线程:和主线程相关,特征:和主线程一起销毁,当主线程停止,守护进程也会被停止
用户线程:指用户自定义创建的线程,主线程停止,用户线程停止