摘要:
Server端代码:public class NioServer { //通道管理器 private Selector selector; //获取一个ServerSocket通道,并初始化通道 public NioServer init(int port) throws IOException{ //获取一个ServerSocket通道 ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlock... 阅读全文
摘要:
字面翻译是“两阶段终止”,这个模式用来进行结束操作后,再终止线程。比如我们想停止一个线程,但是让他停止之前必须要做一些清理工作,这时候就需要用到two-phase termination模式。public class TwoPhaseTerminationTest { /** * @param args */ public static void main(String[] args) { System.out.println("main begin"); try { CountupThread t = new Co... 阅读全文
摘要:
Future是未来,预期的意思,Thread-permessage模式是指将任务交给其他线程来做,但是如果想知道处理的结果,就要使用Future模式,它的典型应用时执行一个需要花一些时间的方法,会立即返回一个future提货单,然后调用方可以继续处理自己的业务逻辑,然后需要的时候再查看future是否返回,一直等到future结果已经处理完毕。thread-pre-message模式发送的请求很像这样 host.request(10,‘A’),只有请求,没有返回值,而future pattern模式发送请求后会马上就要有返回值,类似这样 Data data=host.request(10, 阅读全文
摘要:
Worker是“工人”的意思,worker thread pattern中,工人线程(worker thread)会一次抓一件工作来处理,当没有工作可做时,工人线程会停下来等待心得工作过来。Worker Thread也叫做background thread,另外,也有人把视点放在管理工人线程的地方,称之为Thread Pool。public class WorkerThreadTest { /** * @param args */ public static void main(String[] args) { Channel channel = ne... 阅读全文
摘要:
Per是“每一”的意思,所以thread per message解释过来就是“每个消息一个线程”,message在这里可以看做是“命令”或“请求”的意思,对每隔命令或请求,分配一个线程,有这个线程执行。使用thread-pre-message模式时,“委托消息的一端”与“执行消息的一端”会是不同的线程,也就像是委托消息的线程,对执行消息的线程说“这个任务交给你了”。public class ThreadPreMessageTest { /** * @param args */ public static void main(String[] args) { ... 阅读全文
摘要:
当线程“读取”实例的状态时,实例的状态不会改变,只有线程对实例“写入”操作时才会改变。read-write lock 模式将读取和写入分开来处理,在读取数据前获取读锁定,而写入之前,必须获取写锁定。public class ReadWriteThreadTest { public static void main(String[] args) { Data data = new Data(5); new ReaderThread(data).start(); new ReaderThread(data).start(); new R... 阅读全文
摘要:
这个模式跟Guarded模式有点类似,不过需要一个控制台限制请求方和处理方的频度和数量。public class ProducerConsumerTest { /** * @param args */ public static void main(String[] args) { Table table = new Table(3); new MakerThread("MakerThread1", table , 1000).start(); new MakerThread("MakerThread2", ... 阅读全文
摘要:
word自动保存功能,如果文档被修改了,后台线程每隔一段时间会自动执行保存功能,但是如果用户在自动保存之前用Ctrl+S手动保存呢?自动保存还会执行吗?答案是不会,因为这个操作时不需要重复做的。public class BalkingTest { public static void main(String[] args) { Data data = new Data("data.txt","(empty)"); new ChangerThread("ChangerThread", data).start(); new AutoSav 阅读全文
摘要:
线程在运行过程中需要停下来等待,然后再继续执行。范例程序,一个线程(ClientThread)对另外一个线程(ServerThread)传递请求,实现一个模拟消息通道的功能。public class GuardedSuspensionTest { public static void main(String[] args) { RequestQueue queue = new RequestQueue(); ClientThread ct = new ClientThread(queue, "Alice's Client"); ServerThread st = n 阅读全文
摘要:
上一章讲的是线程互斥的synchronized实现,这样做会影响性能,如何才能做到既不影响性能又能达到线程安全的目的呢,就是使用状态绝不会改变的类,Java中的应用就是String类。public class ImmutableThreadTest { /** * @param args */ public static void main(String[] args) { Person p = new Person("Alice", "Alaska"); new PrintPersonThread(p).start(); new PrintPerson 阅读全文