(一)基本概念
进程和线程的概念
进程:一个执行中的程序,每一个进程都有自己独立的一块内存空间、一组系统资源。
线程:一个执行的程序内部,可以包含多个顺序执行流,每个执行流称为一个线程。
线程与进程的关系
进程:享有独立的代码和数据空间,切换开销大。
线程:同一类线程共享代码和数据空间,线程切换的开销小。
多进程:在操作系统中,能同时运行多个任务程序。
多线程:在同一应用程序中,有多个顺序流同时执行。
并发和并行的区别
并行:多个CPU处理多个进程
并发:一个CPU,坐几个进程(单核CPU,假的多线程)
多线程的作用
提高用户体验,使程序的响应速度更快
适合于开发服务程序(如聊天服务等)
适合于开发有多种交互接口的程序(如聊天程序的客户端,网络下载工具)
减轻编写交互频繁、涉及面多的程序的困难(如监听网络端口)
程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以及其他外设)
可以分别设置各个任务的优先级以优化性能。
何时使用多线程
程序需要同时执行两个或多个任务
程序需要实现一些需要等待的任务时:用户输入、文件读写操作、网络操作、搜索等
需要一些后台运动的程序
(二)Java 创建线程的方法 及 使用
通过继承Thread类来创建
定义Thread类的子类
重写该类的run方法
重写该类的start方法(可选)
运行方法 : new 出新类对象-> start()
实现Runnable接口来创建
定义Runnable接口的实现类,
仅需实现接口的run方法
运行方法:作为 new Thread的参数传入
(三)线程的生命周期
生命周期的概念是首次引入,以后学web还会提到
线程是动态的具有一定的生命周期,分别经历从创建、执行、阻塞直到消亡的过程。
线程的优先级
Java将线程的优先级分为10个等级,分别用1-10之间的数字表示。数字越大表明线程的级别越高。
Thread类的三个静态常量:
MAX_PRIORITY 10
MIN_PRIORITY 1
NORM_PRIORITY 5 (默认)
setPriority / getPripority
守护线程 (Daemon): Java中特殊的优先级最低的线程,主要用于为系统中的其它对象和线程提供服务。
setDaemon
(四)线程同步
多个线程访问一个数据对象时,可能对数据造成的破坏。
所以引出线程同步,来解决线程安全问题
解决方案:
互斥锁:保证在每一个时刻,只能有一个线程拥有该互斥锁,其它线程如果需要获得该互斥锁,必须等待当前拥有该锁的线程将其释放
每个类一把锁,每个对象一把锁,只有获取锁的线程可以进入同步区域。
关键字synchronized
(1)synchronized可以用于方法上
(2)synchronized修饰程序块
线程间的合作
死锁
线程间竞争共享资源,互不相让,永远进入一种等待状态。
解决方法:
避免嵌套封锁
只对有请求的进行封锁
wait () 和notify()/notifyAll()方法
线程池的优点
减少创建和销毁线程的开销
避免创建太多的线程导致系统崩溃
简化编程模型
四种可用的线程池:
newSingleThreadExecutor
newFixedThreadPool
newCachedThreadPool
newScheduledThreadPool