- Java 采用的是单线程编程模型
- JVM 进程不是单线程的(创建后启动一个任务线程,同时含其他线程,如垃圾回收线程)
- 耗时操作尽量放入子线程
- 创建线程:继承 Thread;实现 Runnable;实现 callable
- 创建进程:ProcessBuilder 的 start 方法;Runtime 的 exec 方法
- 同步,顺序执行(串行),需等待;异步,并行
- 阻塞,条件不满足,等待;非阻塞,条件不满足,但返回信息通知你不必等待(跳过)
- 阻塞 IO 与非阻塞 IO 类似于 7
- 五种 IO 模型:阻塞 IO 模型;非阻塞 IO 模型;多路复用 IO 模型(常用的 Java NIO);信号驱动 IO 模型;异步 IO 模型。前四种为同步 IO,最后一种为异步 IO
- 多线程不如线程池,线程池处理长连接不划算
- 高性能 IO 设计模式:Reactor 模式;Proactor 模式
- NIO 中几个关键概念:Channel 通道(双向,即可读可写),Buffer 缓冲区(容器,是个连续数组),Selector 选择器(检测通道事件)
- 线程生命周期:创建 (new)、就绪 (runnable)、运行 (running)、阻塞 (blocked)、time waiting、waiting、消亡(dead)
- 上下文切换:单核 CPU 当运行一个线程过程中转去运行另一个线程
- Thread 类中的方法
start ():启动线程,分配必要资源;
run ():定义具体要执行的任务;
sleep ():线程睡眠,交出 CPU,但不释放锁;
yield ():交出 CPU 但不释放锁,不能控制交出的时间,并且只能让相同优先级的线程获取到其 CPU
join ():让线程释放对一个对象持有的锁,并交出 CPU 执行权限;
interrupt ():中断一个正处于阻塞状态的线程,或停止一个正在运行的线程;
stop ():废弃的方法,不安全,基本不用,终止调用 run 方法,强制释放锁;
destory ():同上; - Thread 线程属性
getId ():获取线程 ID
getName () 和 setName ():得到 / 设置线程名称
getPriority () 和 setPriority ():获取 / 设置优先级
isDaemon () 和 setDaemon ():判断是否是守护线程 / 设置守护线程
(JVM 中的垃圾回收器就是一个守护线程) - 线程安全问题:多线程访问或操作临界资源(对象,属性或某个数据库操作等)时遇到的不可预期的异常
- 线程安全解决:序列化访问临界资源(同步互斥访问),即临界资源上锁:synchronized 或 lock
- synchronized 缺陷:代码块内线程阻塞 (如 sleep) 而又没有释放锁,其他线程会一直等待
- Lock 优点:不会造成 synchronized 的无限等待,同时可以知道线程有没有成功获得锁(synchronized 都无法做到),Lock 必须手动释放锁,synchronized 可自动释放
Appendix:http://www.cnblogs.com/dolphin0520/p/3923167.html