《java线程大总结.pdf》由会员分享,可在线阅读,更多相关《java线程大总结.pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、二、一、从结果可以看出,信号量仅仅是对池资源进行监控,但不保证线程的安全,因此,在使用时候,应该自己控制线程的安全访问池资源。阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。有了这样的功能,就为多线程的排队等候的模型实现开辟了便捷通道,非常有用。java.util.concurrent.BlockingQueue继承了 java.ut
2、il.Queue 接口,可以参看API 文档。下面给出一个简单应用的例子:import java.util.concurrent.BlockingQueue;import java.util.concurrent.ArrayBlockingQueue;/*Java 线程:新特征-阻塞队列*author leizhimin 2009-11-5 14:59:15*/public class Test public static void main(String args)throws InterruptedException BlockingQueue bqueue=new ArrayBlocki
3、ngQueue(20);for(int i=0;i 30;i+)/将指定元素添加到此队列中,如果没有可用空间,将一直等待(如果有必要)。bqueue.put(i);System.out.println(向阻塞队列中添加了元素:+i);System.out.println(程序到此运行结束,即将退出-);输出结果:向阻塞队列中添加了元素:0 向阻塞队列中添加了元素:1 向阻塞队列中添加了元素:2 向阻塞队列中添加了元素:3 向阻塞队列中添加了元素:4 向阻塞队列中添加了元素:5 向阻塞队列中添加了元素:6 向阻塞队列中添加了元素:7 向阻塞队列中添加了元素:8 向阻塞队列中添加了元素:9 向阻塞
4、队列中添加了元素:10 向阻塞队列中添加了元素:11 向阻塞队列中添加了元素:12 向阻塞队列中添加了元素:13 向阻塞队列中添加了元素:14 向阻塞队列中添加了元素:15 向阻塞队列中添加了元素:16 向阻塞队列中添加了元素:17 向阻塞队列中添加了元素:18 向阻塞队列中添加了元素:19 可以看出,输出到元素19 时候,就一直处于等待状态,因为队列满了,程序阻塞了。这里没有用多线程来演示,没有这个必要。另外,阻塞队列还有更多实现类,用来满足各种复杂的需求:ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQu
5、eue,SynchronousQueue,具体的API 差别也很小。对于阻塞栈,与阻塞队列相似。不同点在于栈是“后入先出”的结构,每次操作的是栈顶,而队列是“先进先出”的结构,每次操作的是队列头。这里要特别说明一点的是,阻塞栈是Java6的新特征。Java为阻塞栈定义了接口:java.util.concurrent.BlockingDeque,其实现类也比较多,具体可以查看JavaAPI 文档。下面看一个简单例子:import java.util.concurrent.BlockingDeque;import java.util.concurrent.LinkedBlockingDeque;/
6、*Java 线程:新特征-阻塞栈*author leizhimin 2009-11-5 15:34:29*/public class Test public static void main(String args)throws InterruptedException BlockingDeque bDeque=new LinkedBlockingDeque(20);for(int i=0;i 0)cash+=x;/存款System.out.println(name+存款 +x+,当前余额为 +cash);_draw.signalAll();/唤醒所有等待线程。lock.unlock();/释
7、放锁/*取款*param x 操作金额*param name 操作人*/public void drawing(int x,String name)lock.lock();/获取锁try if(cash-x 0)cash+=x;/存款System.out.println(name+存款 +x+,当前余额为 +cash);notifyAll();/唤醒所有等待线程。/*取款*param x 操作金额*param name 操作人*/public synchronized void drawing(int x,String name)if(cash-x 0)synchronized(this)ca
8、sh+=x;/存款System.out.println(name+存款 +x+,当前余额为 +cash);notifyAll();/唤醒所有等待线程。/*取款*param x 操作金额*param name 操作人*/public synchronized void drawing(int x,String name)synchronized(this)if(cash-x 主任务执行了!);/*子任务*/class SubTask extends Thread private String name;private CyclicBarrier cb;SubTask(String name,Cy
9、clicBarrier cb)this.name=name;this.cb=cb;public void run()System.out.println(子任务 +name+开始执行了!);for(int i=0;i 主任务执行了!Process finished with exit code 0 从执行结果可以看出,所有子任务完成的时候,主任务执行了,达到了控制的目标。Java线程是 Java语言中一个非常重要的部分,Java5之前,多线程的语言支持还是比较弱的,内容也较少,写一个复杂的多线程程序是相当有挑战性的。在Java5以后,Java对多线程做了很多扩展,扩展部分称之为并发包。这部分内容大大增强了Java多线程编程的能力,通过使用Java5线程新特征的API,可以很容易的做出复杂的多线程程序。与其他语言相比,已经是相当强悍了。通过十多篇博文,将Java多线程的方方面面过了一遍,对我来说是一个学习和提高的过程,也为 Java线程系列博文能给后来的学习者带来便利。知识点都过了一遍,要总结起来感觉很困难,毕竟Java线程是一个庞大的话题,不知道从何说起,如果泛泛而谈,那总结还有什么意义呢,再次,将前面的博文串联起来,按照先后顺序加上链接,以方便浏览也最好的首尾。