Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的Java并发_Java_Android_Concurrency - Fatal编程技术网

Android上的Java并发

Android上的Java并发,java,android,concurrency,Java,Android,Concurrency,我试图制作一个android应用程序示例,演示并发性问题,但我觉得奇怪的是,我的代码显示了正确的结果,而不是由竞争条件导致的错误结果。以下是我的代码,我读过关于Java思考(大约1150页) 我基本上是从Java中的Think内容中学习,并尝试使其在Android上工作。。。请指出似乎是什么问题,我认为面包数量将成为负值,由于种族条件,但它不是,它的工作正常 在再次阅读了《并发开始》一书后,它说很难编写错误的演示代码,但我们仍然必须注意并发问题,否则我们以后会遇到麻烦 呃,你真的只做了一个面包就

我试图制作一个android应用程序示例,演示并发性问题,但我觉得奇怪的是,我的代码显示了正确的结果,而不是由竞争条件导致的错误结果。以下是我的代码,我读过关于Java思考(大约1150页)


我基本上是从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();
            }
        }
    }
}