将变量锁定到Java中的线程或方法

时间:2014-05-23 16:31:37

标签: java android locks

我正在使用Android应用程序并且我第一次尝试使用锁定并且不确定我做错了什么或者这是否是正确的方法。我有一个可以自行运行的进程,其中包含在开头设置的变量,我需要几秒钟才能完成并运行几种不同的方法。我现在有一个Db变量,并且想要运行db中的每个行项目。我从Db中抓取它们创建一个列表并运行一个调用原始方法的for循环。我尝试使用wait创建新线程,并将其全部锁定而没有任何成功。

我可以在最后一组变量中运行它,因为循环运行很快或者在使用等待时在循环中运行第一个变量。使用wait时我看到了这个错误:

    05-23 11:34:51.766: W/dalvikvm(27052): threadid=13: thread exiting with uncaught exception (group=0x416e3da0)
    05-23 11:34:51.776: E/AndroidRuntime(27052): FATAL EXCEPTION: AsyncTask #2
    05-23 11:34:51.776: E/AndroidRuntime(27052): Caused by:     java.lang.IllegalMonitorStateException: object not locked by thread before wait()

有没有办法在运行几种不同的方法然后重复时保留变量?

代码:

private class calllocknewthread extends AsyncTask<String, Integer, Double>{

        @Override
        protected Double doInBackground(String... params) {
            //Context context = context;
            DatabaseHandler db = new DatabaseHandler(context2);
            // Reading all contacts
            Log.d("Reading: ", "Reading all contacts..");
            List<Contact> contacts = db.getAllContacts();
            for (Contact cn : contacts) {
                accountchecklist.add(cn.getName() + cn.getPassword() + cn.getStrategy() + cn.getBalance() );
                username = cn.getName();
                password = cn.getPassword();
                acb = cn.getBalance();
                strategykey = Integer.parseInt(cn.getStrategy());
                Log.d(Plog, "User data being passed = " + username + " "+ password + " " + acb + " " + strategykey);

                Thread mcall = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        lock.lock();
                        appstate = 0;
                        new CallAPI().execute(listing);
                        //lock.unlock();
                    }
                });

                mcall.start();
                try {
                    mcall.join();
                    mcall.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
            return null;
        }
    }

0 个答案:

没有答案