Android上的Java并发
我试图制作一个android应用程序示例,演示并发性问题,但我觉得奇怪的是,我的代码显示了正确的结果,而不是由竞争条件导致的错误结果。以下是我的代码,我读过关于Java思考(大约1150页)Android上的Java并发,java,android,concurrency,Java,Android,Concurrency,我试图制作一个android应用程序示例,演示并发性问题,但我觉得奇怪的是,我的代码显示了正确的结果,而不是由竞争条件导致的错误结果。以下是我的代码,我读过关于Java思考(大约1150页) 我基本上是从Java中的Think内容中学习,并尝试使其在Android上工作。。。请指出似乎是什么问题,我认为面包数量将成为负值,由于种族条件,但它不是,它的工作正常 在再次阅读了《并发开始》一书后,它说很难编写错误的演示代码,但我们仍然必须注意并发问题,否则我们以后会遇到麻烦 呃,你真的只做了一个面包就
我基本上是从Java中的Think内容中学习,并尝试使其在Android上工作。。。请指出似乎是什么问题,我认为面包数量将成为负值,由于种族条件,但它不是,它的工作正常 在再次阅读了《并发开始》一书后,它说很难编写错误的演示代码,但我们仍然必须注意并发问题,否则我们以后会遇到麻烦 呃,你真的只做了一个面包就指望它会失败吗?竞态条件可能会发生,但不会一直发生,这就是它们的全部恼人之处。您的线程已耗尽:如果(bB.getBreadCount()>0){buyBread();}或者{waitInLine();},请检查您的线程
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private breadBaker bB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("shanwu","Thread Test Starts!");
bB = new breadBaker();
bB.makeBread();
breadBuyer TA = new breadBuyer();
try{
Thread a =new Thread(TA);
Thread b =new Thread(TA);
Thread c =new Thread(TA);
Thread d =new Thread(TA);
Thread e =new Thread(TA);
Thread f =new Thread(TA);
Thread g =new Thread(TA);
Thread h =new Thread(TA);
Thread i =new Thread(TA);
Thread j =new Thread(TA);
a.start();
b.start();
c.start();
d.start();
e.start();
f.start();
g.start();
h.start();
i.start();
j.start();
bB.makeBread();
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class breadBaker{
private int breadCount;
public breadBaker(){
breadCount = 3;
}
public void makeBread(){
breadCount++;
Log.d("shanwu","make one bread, current bread count: "+breadCount);
}
public void giveBread(){
breadCount--;
Log.d("shanwu","sold one bread, current bread count: "+breadCount);
}
public int getBreadCount()
{
return breadCount;
}
}
class breadBuyer implements Runnable{
public void buyBread(){
bB.giveBread();
}
public void waitInLine(){
// Thread.Sleep(100);
}
@Override
public void run() {
// TODO Auto-generated method stub
if(bB.getBreadCount() > 0){
buyBread();
}
else
{
waitInLine();
}
}
}
}