JAVA多线程设计模式
haoni65
这个作者很懒,什么都没留下…
展开
-
线程的创建和启动
java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start(...原创 2009-05-31 14:18:51 · 91 阅读 · 0 评论 -
线程的创建和启动
思考java的synchronized提供了最底层的物理锁,要在synchronized的基础上,实现自己的逻辑锁,就必须仔细设计ReadWriteLock。Q: lock.readLock()为什么不放入try{ } 内?A: 因为readLock()会抛出InterruptedException,导致readingThreads++不执行,而readUnlock()在fin...原创 2009-05-31 14:33:43 · 54 阅读 · 0 评论 -
ReadWriteLock(三)
我们启动了5个读线程和2个写线程,运行结果如下:Thread-0 waiting for read...Thread-1 waiting for read...Thread-2 waiting for read...Thread-3 waiting for read...Thread-4 waiting for read...Thread-5 waiting for w...原创 2009-05-31 14:33:07 · 61 阅读 · 0 评论 -
ReadWriteLock(二)
readLock()用于获得读锁,readUnlock()释放读锁,writeLock()和writeUnlock()一样。由于锁用完必须释放,因此,必须保证lock和unlock匹配。我们修改DataHandler,加入ReadWriteLock:package com.crackj2ee.thread;public class DataHandler { // store...原创 2009-05-31 14:31:51 · 57 阅读 · 0 评论 -
ReadWriteLock(一)
线程读写同一个对象的数据是很普遍的,通常,要避免读写冲突,必须保证任何时候仅有一个线程在写入,有线程正在读取的时候,写入操作就必须等待。简单说,就是要避免“写-写”冲突和“读-写”冲突。但是同时读是允许的,因为“读-读”不冲突,而且很安全。要实现以上的ReadWriteLock,简单的使用synchronized就不行,我们必须自己设计一个ReadWriteLock类,在读之前,必须先获得...原创 2009-05-31 14:30:06 · 78 阅读 · 0 评论 -
Worker Pattern(四)
最后,Main负责完成main()方法:package com.crackj2ee.thread;public class Main { public static void main(String[] args) { TaskQueue queue = new TaskQueue(); ThreadPool pool = new Thre...原创 2009-05-31 14:28:56 · 47 阅读 · 0 评论 -
Worker Pattern(三)
最后,Main负责完成main()方法:package com.crackj2ee.thread;public class Main { public static void main(String[] args) { TaskQueue queue = new TaskQueue(); ThreadPool pool = new Thre...原创 2009-05-31 14:28:27 · 166 阅读 · 0 评论 -
Worker Pattern(二)
终于到了真正的WorkerThread,这是真正执行任务的服务器线程:package com.crackj2ee.thread;public class WorkerThread extends Thread { private static int count = 0; private boolean busy = false; private bool...原创 2009-05-31 14:27:25 · 78 阅读 · 0 评论 -
Worker Pattern(一)
前面谈了多线程应用程序能极大地改善用户相应。例如对于一个Web应用程序,每当一个用户请求服务器连接时,服务器就可以启动一个新线程为用户服务。然而,创建和销毁线程本身就有一定的开销,如果频繁创建和销毁线程,CPU和内存开销就不可忽略,垃圾收集器还必须负担更多的工作。因此,线程池就是为了避免频繁创建和销毁线程。每当服务器接受了一个新的请求后,服务器就从线程池中挑选一个等待的线程并执行请...原创 2009-05-31 14:25:39 · 113 阅读 · 0 评论 -
GuardedSuspention(二)
服务器线程在红色部分可能会阻塞,也就是说,Queue.getRequest是一个阻塞方法。这和java标准库的许多IO方法类似。最后,写一个Main来启动他们:package com.crackj2ee.thread;public class Main { public static void main(String[] args) { Qu...原创 2009-05-31 14:23:53 · 110 阅读 · 0 评论 -
GuardedSuspention(-)
GuardedSuspention模式主要思想是:当条件不满足时,线程等待,直到条件满足时,等待该条件的线程被唤醒。我们设计一个客户端线程和一个服务器线程,客户端线程不断发送请求给服务器线程,服务器线程不断处理请求。当请求队列为空时,服务器线程就必须等待,直到客户端发送了请求。先定义一个请求队列:Queuepackage com.crackj2ee.thread;...原创 2009-05-31 14:23:11 · 103 阅读 · 0 评论 -
wait/notify机制
前面讲了wait/notify机制,Thread还有一个sleep()静态方法,它也能使线程暂停一段时间。sleep与wait的不同点是:sleep并不释放锁,并且sleep的暂停和wait暂停是不一样的。obj.wait会使线程进入obj对象的等待集合中并等待唤醒。但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出Interrupt...原创 2009-05-31 14:21:48 · 60 阅读 · 0 评论 -
Java锁机制
多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每个人都是一个线程。当A希望进入房间时,他必须获得门锁,一旦A获得门锁,他进去后就立刻将门锁上,于是B,C,D...就不得不在门外等待,直到A释放锁出来后,B,C,D...中的某一人抢到了该锁(具体抢法依赖于JVM的实现,可以先到先得,也可以随机挑选),然后进屋又将门锁上。这样,任一时刻最多有一人在屋内(使用共享资源)。J...原创 2009-05-31 14:21:11 · 43 阅读 · 0 评论 -
线程的同步
由于同一进程内的多个线程共享内存空间,在Java中,就是共享实例,当多个线程试图同时修改某个实例的内容时,就会造成冲突,因此,线程必须实现共享互斥,使多线程同步。最简单的同步是将一个方法标记为synchronized,对同一个实例来说,任一时刻只能有一个synchronized方法在执行。当一个方法正在执行某个synchronized方法时,其他线程如果想要执行这个实例的任意一个synch...原创 2009-05-31 14:20:31 · 54 阅读 · 0 评论 -
JAVA 多线程文章系列[枫叶 KR 整理]
JAVA 多线程文章系列[枫叶 KR 整理]精通LINUX&UNIX Shell程序设计.pdf原创 2009-05-31 14:53:10 · 70 阅读 · 0 评论