并发模块的类型
-
进程:
私有空间,彼此隔离
拥有整台计算机的资源
进程之间通过消息传递相互协作
一般来说,进程=程序=应用 -
线程:
程序内部的控制机制
隶属于进程
程序共享、内存共享
从Java中开启一个线程的方法
-
从Thread中派生子类
A extends Thread
重写其中的run方法
再使用 new A().start() 调用线程 -
从Runable接口构造Thread对象
Implements Runable
重写run方法
再使用 new Thread(new A()).start() 调用线程
线程的交错和竞争
- 时间分片:
每个时刻只能执行一个线程
通过时间分片,多个线程共享处理器
由操作系统调度 - 线程间共享内存
- 竞争条件:
程序的正确性(后置条件和不变量)取决于A和B执行的相对顺序,则称A和B产生竞争
原子操作 - 消息传递:
每次的信息(请求)被放在一个队列中,每次处理一个请求。但在处理请求时,请求发送方不会停止工作,故会产生在信息传递时间上的交错
不能解决竞争条件问题 - 难以测试和调试
- 调用某些方法来主动影响线程之间的交错关系
Thread.sleep() 将某个线程休眠,其他线程得到执行机会
sleep休眠的线程不会失去对现有的锁的所有权
t.interrupt() 从其他线程向线程t 发送中断信号
线程在正常执行的过程中收到中断信号,可能不会理会
若在休眠前进收到中断信号,则会抛出异常