代码调试(debugging)
Debug的方式
{ 边 写 边 d e b u g 写 完 再 d e b u g \left\{ \begin{array}{c} 边写边debug \\ 写完再debug\end{array}\right. {边写边debug写完再debug
诊断
{ I n s t r u m e n t a t i o n : S y s t e m . o u t . p r i n t , l o g g i n g D i v i d e a n d C o n q u e r : 一 块 一 块 运 行 S l i c i n g : 缩 小 查 找 的 范 围 , 找 和 错 误 相 关 的 代 码 , 倒 退 F o c u s o n d i f f e r e n c e : 找 每 次 提 交 的 差 异 S y m b o l i c D e b u g g i n g : 用 于 学 术 上 , 输 入 符 号 值 → 符 号 表 达 式 D e b u g g e r L e a r n F r o m O t h e r \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. ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧Instrumentation:System.out.print,loggingDivideandConquer:一块一块运行Slicing:缩小查找的范围,找和错误相关的代码,倒退Focusondifference:找每次提交的差异SymbolicDebugging:用于学术上,输入符号值→符号表达式DebuggerLearnFromOther
工具
logging
并发
2种并行模式:
{
共
享
内
存
消
息
传
递
\left\{ \begin{array}{c} 共享内存\\ 消息传递\end{array}\right.
{共享内存消息传递
{
进
程
(
P
r
o
c
e
s
s
)
:
私
有
空
间
,
彼
此
隔
离
线
程
(
T
h
r
e
a
d
)
:
程
序
内
部
的
控
制
机
制
\left\{ \begin{array}{c} 进程(Process):私有空间,彼此隔离\\ 线程(Thread):程序内部的控制机制\end{array}\right.
{进程(Process):私有空间,彼此隔离线程(Thread):程序内部的控制机制
进程
- 拥有计算机的所有资源
- 多进程间不共享内存→用消息传递
- 进程=程序=应用
- 一个应用可以有多个进程
- OS支持进程间通信:不仅限于本机,也可以是不同机器间
- JAVA虚拟机(JVM)通常为单一进程(也可以是多个:ProcessBuilder)
线程
- 进程内的小程序
- 进程=虚拟机,线程=虚拟CPU
- 一个线程可分出多个
- 共享进程资源:内存
- 难以获得现成的私有内存,但线程有自己的堆栈
- 线程的协调需要代价
- 每个应用至少一个线程(主线程,自动创建的)
- 主线程可以创建其他的线程:接口,Runnable
学过的-able:
{ C o m p a r a b l e / C o m p a r a t o r I t e r a b l e / I t e r a t o r O b s e r v a b l e / O b e s r v e r T h r o w a b l e R u n n a b l e \left\{ \begin{array}{c} Comparable/Comparator \\ Iterable/Iterator \\ Observable/Obesrver\\ Throwable\\ Runnable\end{array}\right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧Comparable/ComparatorIterable/IteratorObservable/ObesrverThrowableRunnable
Thread应该start而非run,不能start→Runnable
交错竞争
- 一个核的每一时刻只能执行一个线程
- 时间分片→多进程/多线程共享处理:OS自动调度
- 一般,多核的线程/进程数也多于核数
- 时间交错
- 外围的发布访问慢
- Thread.sleep():自己暂停
- Thread.interrupt():其他线程请求(不一定答应,sleep时才会答应)
- Thread.isinterrupt():检测是否暂停
- Thread.yield():自己放弃占用
- Thread.join()