java中为什么先创建的对象不先执行呢,问的不准结合代码看吧。

classQ{intn;booleanvalueSet=false;synchronizedvoidput(intn){if(!valueSet)try{wait();}... class Q {
int n;
boolean valueSet=false;

synchronized void put(int n) {
if(!valueSet)
try{
wait();
}catch(InterruptedException e){
System.out.println("Interrupted exception caught.");
}
this.n = n;
System.out.println("Put: " + n);
valueSet=false;
notify();
}

synchronized int get() {
if(valueSet)
try{
wait();
}catch(InterruptedException e){
System.out.println("Interrupted exception caught.");
}
System.out.println("Got: " + n);
valueSet=true;
notify();
return n;
}
}
//======================================================
class Producer implements Runnable {
Q q;

Producer(Q q) {
this.q = q;
new Thread(this, "Producer").start();
}

public void run() {
int i = 0;
// while(true) {
for(int m=15;m>0;m--)
q.put(i++);
// }
}
}
//======================================================
class Consumer implements Runnable {
Q q;

Consumer(Q q) {
this.q = q;
new Thread(this, "Consumer").start();
}

public void run() {
// while(true) {
for(int m=15;m>0;m--)
q.get();
// }
}
}
//======================================================
class PC {
public static void main(String args[]) {
Q q = new Q();
new Producer(q);
new Consumer(q);
System.out.println("Press Control-C to stop.");
}
}
//======================================================
上面代码main中,先创建的Producer对像,调用的是put方法,导致的屏幕输出应该是Put: 0 ;接着创建Consumer对像,调用get方法,输出Got: 0
可结果是先Got后put,我觉得Producer里面的循环反应再快也不至于跑到Consumer后面吧,怎么说第1行也应该是Put: 0啊。
我的描述有些外行,希望大家能看明白。
=================================
输出结果是这样的:
Press Control-C to stop.
Got: 0
Put: 0
Got: 0
Put: 1
Got: 1
Put: 2
应该是Producer类的循环比Consumer类的循环先开始吧。
以前看代码习惯顺序的思考,现在学java遇到很多次问题。不知道什么时候能适应过来!
=========================================================================
这两个线程的顺序怎么能是随机的呢?先创建的不先运行?? 我运行很多次都是Got:0在最前面 ,等回家用好电脑再试试。
=========================================================================
这么说先start的后run很正常了?
展开
 我来答
百度网友f4bb65c
2010-07-19 · TA获得超过476个赞
知道小有建树答主
回答量:188
采纳率:0%
帮助的人:258万
展开全部
细看了一下代码,就算是先调用put(),这个线程会在wait出阻塞住,由于valueSet初始为false,get跳过if执行下面输出方法,并将valueSet改为true,调用notify之后,put()中的wait才会接触阻塞,然后按顺序互斥执行。把valueSet初始值改成true大概就可以了
in_the_blues
2010-07-19 · TA获得超过113个赞
知道答主
回答量:124
采纳率:0%
帮助的人:85.3万
展开全部
线程的运行顺序取决于JVM(java的虚拟机)调度。先创建只能说明producer对象比consumer对象的线程先start,但run的时候是取决于JVM的与设置的优先级及其他的东东无关。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangzhen2018
2012-04-19
知道答主
回答量:6
采纳率:0%
帮助的人:3.7万
展开全部
没有什么先后 的 演示是 一个同步 行为
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式