黑马程序员技术交流社区

标题: 大家帮我看看为什么会输出这样的结果? [打印本页]

作者: 江南雨    时间: 2013-5-26 18:48
标题: 大家帮我看看为什么会输出这样的结果?
本帖最后由 江南雨 于 2013-5-26 18:50 编辑
  1. public class Operation {
  2.         private int [] a=new int[10];
  3.         int pcount=0,tcount=0;
  4.         int count=0;
  5.         public Operation(){
  6.                
  7.         }
  8.         public synchronized void put(int x) throws InterruptedException{
  9.                 while(count==10){
  10.                         wait();
  11.                 }
  12.                 a[pcount]=x;
  13.                 System.out.println("put:a["+pcount+"]"+"="+x);
  14.                 if(++pcount==10){
  15.                         pcount=0;
  16.                 }
  17.                 ++count;
  18.         
  19.                 notify();
  20.                 //Thread.currentThread().sleep(10);
  21.         }
  22.         public synchronized void take() throws InterruptedException{
  23.                 while(count==0){
  24.                         wait();
  25.                 }
  26.                 int x=a[tcount];
  27.                 System.out.println("take:a["+tcount+"]"+"="+x);
  28.                 if(++tcount==10){
  29.                         tcount=0;
  30.                 }
  31.                 count--;
  32.                 notify();
  33.                 //Thread.currentThread().sleep(10);
  34.         }

  35. }
  36. public class MyThread1 implements Runnable {
  37.         Operation op;
  38.         public MyThread1(Operation op){
  39.                 this.op=op;
  40.         }
  41.         @Override
  42.         public void run() {
  43.                 while(true){
  44.                         int x=(int)( Math.random()*10+1);
  45.                         try {
  46.                                 op.put(x);
  47.                                 //Thread.currentThread().sleep(1000);
  48.                         } catch (InterruptedException e) {
  49.                                 // TODO Auto-generated catch block
  50.                                 e.printStackTrace();
  51.                         }
  52.                         
  53.                 }

  54.         }

  55. }

  56. public class MyThread2 implements Runnable {
  57.         Operation op;
  58.         public MyThread2(Operation op){
  59.                 this.op=op;
  60.         }
  61.         @Override
  62.         public void run() {
  63.                 while (true) {
  64.                         // TODO Auto-generated method stub
  65.                         try {
  66.                                 op.take();
  67.                                 //Thread.currentThread().sleep(1000);
  68.                         } catch (InterruptedException e) {
  69.                                 // TODO Auto-generated catch block
  70.                                 e.printStackTrace();
  71.                         }
  72.                 }

  73.         }

  74. }
  75. public class MainClass {
  76.         public static void main(String[] args) {
  77.                 // TODO Auto-generated method stub
  78.                 Operation op=new Operation();
  79.                 Thread mythread1=new Thread(new MyThread1(op));
  80.                 Thread mythread2=new Thread(new MyThread2(op));
  81.                 mythread1.start();
  82.                 mythread2.start();

  83.         }

  84. }
  85. 运行结果:这个运行结果不是应该从a[0]=x开始吗?
  86. put:a[7]=10
  87. put:a[8]=8
  88. put:a[9]=2
  89. put:a[0]=3
  90. put:a[1]=8
  91. put:a[2]=8
  92. put:a[3]=9
  93. put:a[4]=1
  94. take:a[5]=8
  95. take:a[6]=1
  96. take:a[7]=10
  97. take:a[8]=8
  98. take:a[9]=2
  99. take:a[0]=3
  100. take:a[1]=8
  101. take:a[2]=8
  102. take:a[3]=9
  103. take:a[4]=1
  104. put:a[5]=5
  105. put:a[6]=4
  106. put:a[7]=10
  107. put:a[8]=4
  108. put:a[9]=10
  109. put:a[0]=4
  110. put:a[1]=3
  111. put:a[2]=8
  112. put:a[3]=4
  113. put:a[4]=9
  114. take:a[5]=5
  115. take:a[6]=4
  116. take:a[7]=10
  117. take:a[8]=4
  118. take:a[9]=10
  119. take:a[0]=4
  120. take:a[1]=3
  121. take:a[2]=8
  122. take:a[3]=4
  123. take:a[4]=9
  124. put:a[5]=1
  125. put:a[6]=8
  126. put:a[7]=9
  127. put:a[8]=4
  128. put:a[9]=4
  129. put:a[0]=7
  130. put:a[1]=8
  131. put:a[2]=1
  132. put:a[3]=2
  133. put:a[4]=1
  134. take:a[5]=1
  135. take:a[6]=8
  136. take:a[7]=9
  137. take:a[8]=4
  138. take:a[9]=4
  139. take:a[0]=7
  140. take:a[1]=8
  141. take:a[2]=1
  142. take:a[3]=2
  143. take:a[4]=1
  144. put:a[5]=3
  145. put:a[6]=6
  146. put:a[7]=7
  147. put:a[8]=9
  148. put:a[9]=9
  149. put:a[0]=7
  150. put:a[1]=5
  151. put:a[2]=7
  152. put:a[3]=2
  153. put:a[4]=6
  154. take:a[5]=3
  155. take:a[6]=6
  156. take:a[7]=7
  157. take:a[8]=9
  158. take:a[9]=9
  159. take:a[0]=7
  160. take:a[1]=5
  161. take:a[2]=7
  162. take:a[3]=2
  163. take:a[4]=6
  164. put:a[5]=6
  165. put:a[6]=4
  166. put:a[7]=6
  167. put:a[8]=8
  168. put:a[9]=2
  169. put:a[0]=3
  170. put:a[1]=10
  171. put:a[2]=1
  172. put:a[3]=8
  173. put:a[4]=5
  174. take:a[5]=6
  175. take:a[6]=4
  176. take:a[7]=6
  177. take:a[8]=8
  178. take:a[9]=2
  179. take:a[0]=3
  180. take:a[1]=10
  181. take:a[2]=1
  182. take:a[3]=8
  183. take:a[4]=5
  184. put:a[5]=6
  185. put:a[6]=3
  186. put:a[7]=9
  187. put:a[8]=2
  188. put:a[9]=6
  189. put:a[0]=6
  190. put:a[1]=8
  191. put:a[2]=8
  192. put:a[3]=7
  193. put:a[4]=5
  194. take:a[5]=6
  195. take:a[6]=3
  196. take:a[7]=9
  197. take:a[8]=2
  198. take:a[9]=6
  199. take:a[0]=6
  200. take:a[1]=8
  201. take:a[2]=8
  202. take:a[3]=7
  203. take:a[4]=5
  204. put:a[5]=7
  205. put:a[6]=2
  206. put:a[7]=9
  207. put:a[8]=9
  208. put:a[9]=4
  209. put:a[0]=10
  210. put:a[1]=2
  211. put:a[2]=1
  212. put:a[3]=2
  213. put:a[4]=2
  214. take:a[5]=7
  215. take:a[6]=2
  216. take:a[7]=9
  217. take:a[8]=9
  218. take:a[9]=4
  219. take:a[0]=10
  220. take:a[1]=2
  221. take:a[2]=1
  222. take:a[3]=2
  223. take:a[4]=2
  224. put:a[5]=7
  225. put:a[6]=6
  226. put:a[7]=8
  227. put:a[8]=8
  228. put:a[9]=9
  229. put:a[0]=8
  230. put:a[1]=4
  231. put:a[2]=8
  232. put:a[3]=7
  233. put:a[4]=1
  234. take:a[5]=7
  235. take:a[6]=6
  236. take:a[7]=8
  237. take:a[8]
复制代码
上面的运行结果只是其中的一部分;运行多次后出现的结果
作者: 韩明海    时间: 2013-5-26 20:03
我的运行结果确实是从0开始的,
put:a[0]=10
take:a[0]=10
put:a[1]=4
take:a[1]=4
put:a[2]=10
put:a[3]=6





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2