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很正常了? 展开
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很正常了? 展开
3个回答
展开全部
线程的运行顺序取决于JVM(java的虚拟机)调度。先创建只能说明producer对象比consumer对象的线程先start,但run的时候是取决于JVM的与设置的优先级及其他的东东无关。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没有什么先后 的 演示是 一个同步 行为
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询