软件构造知识点复习:debugging+并发

代码调试(debugging)

Debug的方式

{debugdebug\left\{ \begin{array}{c} 边写边debug \\ 写完再debug\end{array}\right.

诊断

{InstrumentationSystem.out.printloggingDivideandConquerSlicing退FocusondifferenceSymbolicDebuggingDebuggerLearnFromOther\left\{ \begin{array}{c} Instrumentation:System.out.print,logging \\ Divide and Conquer:一块一块运行 \\ Slicing:缩小查找的范围,找和错误相关的代码,倒退\\ Focus on difference:找每次提交的差异\\ Symbolic Debugging:用于学术上,输入符号值→符号表达式\\ Debugger\\ Learn From Other\end{array}\right.

工具

logging

并发

2种并行模式:
{\left\{ \begin{array}{c} 共享内存\\ 消息传递\end{array}\right.
{(Process)线(Thread)\left\{ \begin{array}{c} 进程(Process):私有空间,彼此隔离\\ 线程(Thread):程序内部的控制机制\end{array}\right.

进程

  • 拥有计算机的所有资源
  • 多进程间不共享内存→用消息传递
  • 进程=程序=应用
  • 一个应用可以有多个进程
  • OS支持进程间通信:不仅限于本机,也可以是不同机器间
  • JAVA虚拟机(JVM)通常为单一进程(也可以是多个:ProcessBuilder)

线程

软件构造知识点复习:debugging+并发

  • 进程内的小程序
  • 进程=虚拟机,线程=虚拟CPU
  • 一个线程可分出多个
    软件构造知识点复习:debugging+并发
  • 共享进程资源:内存
  • 难以获得现成的私有内存,但线程有自己的堆栈
  • 线程的协调需要代价
  • 每个应用至少一个线程(主线程,自动创建的)
  • 主线程可以创建其他的线程:接口,Runnable
    软件构造知识点复习:debugging+并发
    学过的-able:
    {Comparable/ComparatorIterable/IteratorObservable/ObesrverThrowableRunnable\left\{ \begin{array}{c} Comparable/Comparator \\ Iterable/Iterator \\ Observable/Obesrver\\ Throwable\\ Runnable\end{array}\right.
    软件构造知识点复习:debugging+并发
    Thread应该start而非run,不能start→Runnable

交错竞争

  • 一个核的每一时刻只能执行一个线程
  • 时间分片→多进程/多线程共享处理:OS自动调度
  • 一般,多核的线程/进程数也多于核数
  • 时间交错
  • 外围的发布访问慢
  • Thread.sleep():自己暂停
  • Thread.interrupt():其他线程请求(不一定答应,sleep时才会答应)
  • Thread.isinterrupt():检测是否暂停