这儿我用Debug看了,貌似进入死循环了

问题描述

importjava.nio.Buffer;importjava.nio.IntBuffer;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassSuperThread{//定义缓冲区的读写锁privateLockbufferLock=newReentrantLock();//共享缓冲区publicstaticIntBufferbuffer=IntBuffer.allocate(5);//生产者数组publicintarray[]={1,5,6,9,8,11,13,10,7,3};//生产者执行的次数publicstaticintcount=0;//两个生产者取出数据的累加publicstaticintconsumerSum=0;//记录消费者取数次数publicstaticintconsumerCount=0;//存放从缓冲区中取得的数据privatestaticintconsumerData;//定义线程名publicStringnameString;//线程互斥信号,值为0表示生产者进程,值为1表示消费者进程publicstaticintmutex=0;/*构造函数*/publicSuperThread(Stringname){//主要完成一些变量的初始化}/*获得线程名*/publicStringgetNameString(){returnnameString;}/*设置线程名*/publicvoidsetNameString(StringnameString){this.nameString=nameString;}/*获得互斥信号*/publicstaticintgetMutex(){returnmutex;}/*设置互斥信号*/publicstaticvoidsetMutex(intmutex){SuperThread.mutex=mutex;}/*判断是否有线程访问缓冲区,没有则对线程进行加锁*/publicbooleanwait(intmutex){if(mutex==1){returnfalse;}else{returntrue;}}/*释放进程操作完成信号,其实本质就是修改mutex的信号值*/publicstaticvoidsignal(){mutex=0;}publicbooleanisBufferEmpty(){//判断缓冲区是否为空intcount=0;for(inti=0;i<buffer.capacity();i++){if(buffer.get(i)==0){//根据缓冲区中的0的个数来判断,若缓冲区0的个数为5(缓冲区容量为5),则为空count++;}}if(count==5){returntrue;}else{returnfalse;}}publicbooleanisBufferFull(){//判断缓冲区是否为满intcount=0;for(inti=0;i<buffer.capacity();i++){if(buffer.get(i)!=0){//根据缓冲区中不为0的个数来判断,若缓冲区不为0的个数小于5(缓冲区容量为5)则不为满count++;}}if(count<5){returnfalse;}else{returntrue;}}/*消费数,即在缓冲区中取数*/publicvoidconsume(){if(wait(mutex)&&!isBufferEmpty()){bufferLock.lock();//对该程序段加锁,防止其他线程访问缓冲区try{setMutex(1);//将线程互斥信号值mutex设置为1,使之互斥intindex=0;//存放顺序查找第一个为0的数的下摆inti;for(i=0;i<buffer.capacity();i++){//顺序查找第一个为0的数if(buffer.get(i)==0){index=i;break;}elseif(buffer.get(4)>0){//缓冲区为满的情况index=5;}}consumerData=getBufferData(index-1);//取数据consumerCount++;if(consumerCount<=2){consumerSum=consumerSum+consumerData;//计算两次取数之和if(consumerCount==2){System.out.println("消费者取数之和为:"+consumerSum);consumerSum=0;consumerCount=0;}}buffer.put(index-1,0);//将已取过数的缓冲区重新置0//consumerPrintBufferData();//输出取数后的缓冲区signal();//释放互斥信号,将mutex设置为0}finally{bufferLock.unlock();//解锁}}}/*消费者取得缓冲区数据*/publicintgetBufferData(intindex){//完成取数操作returnbuffer.get(index);}/*生产数,即向缓冲区中存数*/publicvoidproduce(){if(wait(mutex)&&!isBufferFull()){bufferLock.lock();//对该程序段加锁,防止其他线程访问缓冲区try{setMutex(1);//将线程互斥信号值mutex设置为1,使之互斥intindex=0;for(inti=0;i<buffer.capacity();i++){//寻找存数的位置if(buffer.get(i)==0){index=i;break;}}putBufferData(index);//向缓冲区中存入数据signal();//释放互斥信号,将mutex设置为0}finally{bufferLock.unlock();//解锁}}}/*生产者向公共缓冲区放数据*/publicvoidputBufferData(intindex){buffer.put(array[index]);//完成想缓冲区存数操作}}publicclassTest{publicstaticvoidmain(String[]args){Producerproducer=newProducer("producer");Consumerconsumer1=newConsumer("consumer1");Consumerconsumer2=newConsumer("consumer2");newThread(producer).start();newThread(consumer1).start();newThread(consumer2).start();}}后面是测试包含main方法的类,producer和consumer中run方法只是执行superthread中prduce和consum方法,执行producer线程后貌似执行consumer1线程时总是break;

解决方案

解决方案二:
给点提示也好

时间: 2024-10-22 19:28:31

这儿我用Debug看了,貌似进入死循环了的相关文章

eclipse debug 看不到代码视图

问题描述 eclipse debug 看不到代码视图 怎么调试出来 解决方案 http://www.cnblogs.com/stonefeng/archive/2012/08/28/2660136.html 解决方案二: 为什么eclipse的debug的代码和程序的代码不一样Eclipse 调试器和 Debug 视图Eclipse 调试器和Debug 视图 解决方案三: 应该是被你给缩放了, 你找到右边的边框处会有 Shared Area ,然后还原.

linux下的cdt在debug看内存值的时候背景色是黑的,怎么变成白色

问题描述 linux下的cdt在debug时,把鼠标放在变量上看内存值的时候背景色是黑的,怎么变成白色,我不知道java版的是不是也是这样,但是我用的cdt都是这样,看起来很不方便,具体效果就是附件中图片的中间那一块 问题补充:changchang 写道 解决方案 这个我也折腾了很久...你用的是ubuntu吧?在eclipse里实在找不到地方改,后来我发现这玩意跟操作系统的工具提示颜色有关...在桌面右击 -> 更改桌面背景 ->主题 -> 自定义 ->颜色 ->工具提示我

各位帮忙看下,为什么下段代码在遨游和IE都可以,但在火狐就不可以!点查询没反应!我看了貌似是lookresearch方法没进去!

问题描述 <scriptlanguage="javascript">$(document).ready(function(){$('#btn').click(function(){varparams=$('input').serialize();showupdate1.style.display="none";showupdate2.style.display="block";$.ajax({url:'<%=path%>/

java-一段小小的代码看了一晚上了还是出不了结果,哪位大神能帮忙一下啊

问题描述 一段小小的代码看了一晚上了还是出不了结果,哪位大神能帮忙一下啊 package sjk; import java.sql.*; public class sjkText { public static void main(String[] args) { Connection ct=null; Statement sm=null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ct=DriverManager.get

作为一个互联网人,这部电影你不得不看

最近,腾讯员工拍了一部记录互联网生活的电影--<@互联网人> 没有巨星撑场,没有电影公司撑腰,也没有土豪投资. 由互联网人和 90 后团队共同打造,90% 的演员来自腾讯. 就是这么一部看似「来路不明」的电影,却被腾讯内部论坛乐问达人夸赞道: 作为豆瓣上最犀利的影评人,这片子打 6 分绰绰有余. 连最爱吐槽的同事,也在朋友圈评论称「竟然很不错」.  男主角 KB,是一个一心扑在工作上的产品经理. 今年 30 岁,单身.某天突然被抽调到新的"突击小组",要在两个月内开发出新产

各位大神看过来!我发文本信息时偶尔进度条转很久信息才发送出去?求解啊

问题描述 这是发信息的代码,holder.pb就是信息前面的进度条 解决方案 debug下看看,在这个成功回调的方法中来更新这个发送消息成功的状态的,你这边可以debug看下这个代码了.

如何Debug JAVA api源码

问题描述 现在下载下来API源码了写了一个测试类,想debug看下源码是怎么实现的.例如:importjava.util.HashMap;publicclassTestHashMap{/***@paramargs*/publicstaticvoidmain(String[]args){HashMap<String,String>map=newHashMap<String,String>();map.put("name","username")

六一来了,孩子看什么电影?

谈到这个问题,我想不仅是我,大多数成人都会为这个看似很浅显的问题搞得很尴尬.的确,电影院仍旧被成人们前后占据着,除了口号性质的"鼓励"孩子们走进来之外,根本就没给他们留任何的空间,我想这不仅仅只是单从消费能力上做的考量吧. 上个月,一度有部<熊猫回家路>在影院上映,但可惜的是影片的宣传可谓是做到铺天盖地,可是票房仍旧毫无起色,原本,影片是想借助六一前夕打好预热以便于随即大赚一笔孩子钱的,但可惜算盘没打好,赔本折吆喝,六一假期,家长们没打算带着孩子耗费成本进电影院里接受怎样的

Akka笔记之日志及测试

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 在前两篇笔记中(第一篇,第二篇),我们简单地介绍了一下Actor以及它的消息传递是如何工作的.在本篇中,我们将看下如何解决TeacherActor的日志打印及测试的问题. 简单回顾 前面我们的Actor是这样的: class TeacherActor extends Actor { val quotes = List( "Moderation is for cowards", "Anything