软件构造7.1
软件构造7.1
What is Concurrent Programming?
网络上的多台计算机
一台计算机上的多个应用
一个cpu上的多核处理器
- 共享内存:在内存读写中共享数据
两个处理器共享内存,两个程序共享文件系统,一个Java程序两个线程共享对象 - 消息传递:通过channel交换消息
两台计算机通过网络连接通讯,浏览器和web服务器,即时通讯软件的客户端和服务器,同一计算机的两个程序通过管道连接进行通讯
Processes, Threads, Time-slicing 进程、线程、时间分片
- 进程:私有空间,彼此隔离,一个运行的程序都是一台虚拟机,有独立的内存,cpu,堆栈
- 线程:程序的内部控制机制,线程是运行程序中的控制点,把它看作是正在运行程序中的一个位置,加上导致该位置的方法调用堆栈
进程
拥有整台计算机的资源,不共享内存
一般来说:进程= =程序= =应用,但是一个应用可能包括多个进程
线程
进程=虚拟机,线程=虚拟cpu,隶属于进程,共享内存
Starting a thread in Java在Java中启动一个线程
每个应用至少一个线程,有一个主线程,可以创建其他线程
通过Thread构造
Interleaving and Race Condition 交错和竞争
Time slicing
虽然有多个线程,但是只有一个核,同一时间只能执行一个线程。
Shared Memory among Threads 在线程之间共享内存
可能会引入bug,不同线程会访问同一个,顺序不同,结果不同
Race Condition 竞争条件
原子操作:有java虚拟机确定
不能通过观察一个表达式确定是否安全
Message Passing Example
消息传递机制也无法解决竞争条件问题
Concurrency is hard to test and debug 并发很难测试和调试
竞争条件的存在,加入print等可能会导致bug消失
Some operations for interfering automatic interleaving of threads 利用某些方法调用来主动影响线程之间的interleaving关系
线程休眠 Thread.sleep()
中断 Thread.interrupt()
一般来说,线程在收到中断信号后直接终止,但是县城受到其他线程发来的中断信号,不一定要停止
先sleep,后才能interrupt,sleep是阻塞,线程会暂时停在这里。interrupt 是打断。只有阻塞的线程被打断了,才会报intrttuptedException异常
interrupted会清除当前的中断状态,如果连续两次调用该方法,那么第一次调用时,如果当前线程已经处于中断状态,那么该方法会返回true,同时清除当前线程被标记的中断状态。第二次调用时,(第二次调用之前,没有再次调用Thread.currentThread().interrupt();)就会返回false了。
Thread.yield() 放弃当前线程,转而执行其他线程。
Thread.join() 当前进程保持运行直至结束