package A;import java.util.*;class B { public static void main(String[] args) { A sim_a=new A(); int count = 0; int b; sim_a.start(); // 启动线程A for(int j=0;j<100;j++){ //运行100次 b = sim_a.getA(); //取得线程A产生的随机值 if(b >= 0) count++; else count--; System.out.print(b+"\t"); System.out.println(count); } }}class A extends Thread{ int a ,i; public void run(){ Random rand = new Random(); a=rand.nextInt()%100; // 产生-100到100之内的随机数 yield(); } public void setA(int a){ this.a = a; } public int getA(){ return this.a; }}为什么不能正确得到 计算器的记数?
主线程start子线程之后,主线程继续执行,当执行到 b = sim_a.getA();时,因为子线程虽然start,但他只是加入了cpu竞争队列,还没有得到执行,而且sim_a中a的初值为0,所以这里b第一次得到的很可能是0 一段时间之后,子线程得到cpu时间片,产生随机数并赋给a,这时主线程就得到了产生的随机数了
public void run(){ Random rand = new Random(); a=rand.nextInt()%100; // 产生-100到100之内的随机数 yield(); //这里不要yield()就可以得到计数器的值了,只不过可能不是你期望的值 }
你的sim_a只运行了一次,然后就挂起了还怎么产生随机数啊
class A { int count=0; public static void main(String[] args) { A a=new A(); B b=new B(a); Thread t=new Thread(b); b.start(); b.join(); System.out.println("a.count="+a.count); } } class B implements Runnable { A a; public B(A a) { this.a=a; } Random rd=new Random(); public void run() { for(int i=0;i<100;i++)//假设运行100次 { int rand=rd.nextInt()%100; if(rand<0) a.count--; else if(rand>0) a.count++; } } }
修正下t.start(); t.join();
谢谢6楼的回答 但是在netbeans下调试时 把 class B implements Runnable{ 改成 class B extends Thread{并且要添加 java.util.Random 包
}class B {
A a;
}
问题补充:
package A;import java.util.*;class B { public static void main(String[] args) { A sim_a=new A(); int count = 0; int b; sim_a.start(); // 启动线程A for(int j=0;j<100;j++){ //运行100次 b = sim_a.getA(); //取得线程A产生的随机值 if(b >= 0) count++; else count--; System.out.print(b+"\t"); System.out.println(count); } }}class A extends Thread{ int a ,i; public void run(){ Random rand = new Random(); a=rand.nextInt()%100; // 产生-100到100之内的随机数 yield(); } public void setA(int a){ this.a = a; } public int getA(){ return this.a; }}为什么不能正确得到 计算器的记数?
一段时间之后,子线程得到cpu时间片,产生随机数并赋给a,这时主线程就得到了产生的随机数了
class A
{
int count=0;
public static void main(String[] args)
{
A a=new A();
B b=new B(a);
Thread t=new Thread(b);
b.start();
b.join();
System.out.println("a.count="+a.count);
}
}
class B implements Runnable
{
A a;
public B(A a)
{
this.a=a;
}
Random rd=new Random();
public void run()
{
for(int i=0;i<100;i++)//假设运行100次
{
int rand=rd.nextInt()%100;
if(rand<0)
a.count--;
else if(rand>0)
a.count++;
}
}
}
t.join();
但是在netbeans下调试时
把 class B implements Runnable{
改成 class B extends Thread{并且要添加 java.util.Random 包
直接调用run()方法,不会创建新的调用栈,也就不会有创建过多的线程之忧 for(int j=0;j <100;j++){ //运行100次 b = sim_a.getA(); //取得线程A产生的随机值 if(b >= 0) count++; else count--; System.out.print(b+ "\t "); System.out.println(count);
sim_a.run();//在此加上一个run }