//声明:部分内容引自《Java编程思想(第四版)》机械工业出版社
【基本的线程机制】
– 定义任务。只需要实现 Runnable 接口并编写 run() 方法,使得该任务可以执行你的命令。
– Thread 类。调用 Thread 对象的 start() 方法为线程执行必须的初始化操作。
– Executor。管理 Thread 对象。在客户端和人物执行之间提供一个间接层。允许管理异步任务的执行,无需显式地管理线程的生命周期。
CachedThreadPool 在程序执行过程中通常会创建与所需数量相同的线程,然后在它回收旧线程时停止创建新线程。FixedThreadPool 一次性分配有限个线程。SingleThreadExecutor 线程数量为 1。
– 从任务中产生返回值。Runnable 不反回任何值。如果希望任务在完成时能够返回一个值,可以实现 Callable 接口而不是 Runnable 接口。
– 休眠。sleep()。
– 优先级。setPriority(),getPriority()。
– 让步。yield()。
– 后台线程。setDaemon()。
– 编码的变体。在非常简单的情况下,可以使用直接从 Thread 继承的方式,或自管理的 Runnable。
– 术语。
在 Java 中,Thread 类自身不执行任何操作,它只是驱动赋予它的任务,但是线程研究中总是有“线程就是任务”的感觉。
– 加入一个线程。join()。
– 创建有响应的用户界面。使用线程的动机之一就是建立有响应的用户界面。
– 捕获异常。由于线程的本质特性,使得你不能捕获从线程中逃逸的异常。可以用 Executor() 解决。
【共享受限资源】
– 解决共享资源竞争。
防止冲突:当资源被一个任务使用时,在其上加锁。
关键字 synchronized,当要执行被该关键字保护的代码片段的时候,它将检查锁是否可用,然后获取锁,执行代码,释放锁。
Brian 的同步规则:如果你正在写一个变量,它可能接下来将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你必须使用同步,并且,读写线程都必须用相同的监视器锁同步。
– 如果在你的类中有超过一个方法在处理临界数据,那么你必须同步所有相关的方法。
同步控制 EvenGenerator。
使用显式的 Lock 对象。
– 原子性与易变性。
原子操作是不能被线程调度机制中断的操作,一旦操作开始,就一直运行到结束,中间不会切换到其他线程。
原子性可以应用于除 long 和 double 之外的所有基本类型之上的“简单操作”。