种族条件[JAVA]

时间:2015-09-04 03:49:02

标签: java multithreading

在if语句中记录时,我可以成功获取" startTime"的值。变量。一旦我尝试从if语句外部访问此变量,我的问题就出现了。

public class MainActivity extends AppCompatActivity {
String startTime = "";
String endTime = "";
....
....
....
public void dailyHours(){
//Retrieve clockInId (ObjectID for clockInTime)
ParseQuery<ParseObject> startQuery = ParseQuery.getQuery("clockIn");
startQuery.getInBackground(clockInId, new GetCallback<ParseObject>() {
    public void done(ParseObject clockIn, ParseException e) {
        if (e == null) {
            startTime = clockIn.getString("Time");
            Log.d(TAG, "StartTime: " + startTime);
        } else {
            // something went wrong
        }
    }
});

//Retrieve clockOutId (ObjectID for clockOutTime)
ParseQuery<ParseObject> endQuery = ParseQuery.getQuery("clockOut");
endQuery.getInBackground(clockOutId, new GetCallback<ParseObject>() {
    public void done(ParseObject clockOut, ParseException e) {
        if (e == null) {
            endTime = clockOut.getString("Time");
            Log.d(TAG, "EndTime: " + endTime);
        } else {
            // something went wrong
        }
    }
});

例如,当Log.d()被移动到ParseQuery之外时,startTime返回空。

public void dailyHours(){
//Retrieve clockInId (ObjectID for clockInTime)
ParseQuery<ParseObject> startQuery = ParseQuery.getQuery("clockIn");
startQuery.getInBackground(clockInId, new GetCallback<ParseObject>() {
    public void done(ParseObject clockIn, ParseException e) {
        if (e == null) {
            startTime = clockIn.getString("Time");
        } else {
            // something went wrong
        }
    }
});
Log.d(TAG, "StartTime: " + startTime); //startTime returns an empty string when moved here

这是我需要变量的值,所以我可以使用它。如何在我的情况下同步我的线程以消除竞争条件?根据我的理解GetCallback<ParseObject>()在另一个线程上运行,因此可能导致我的问题。

1 个答案:

答案 0 :(得分:0)

这听起来像是一个经典的多线程问题。一种方法是在同步下获得startTime,也许还有endTime。最简单的事情是......

public class MainActivity extends AppCompatActivity {
  String startTime = "";
  String endTime = "";
  ...
  public synchronized void setStartTime(String startTime) {
    this.startTime = startTime;
  }

  public synchronized String getStartTime() {
    return startTime;
  }
  ...
  public void dailyHours() {
    ...
        setStartTime(clockIn.getString("Time"));
        Log.d(TAG, "StartTime: " + getStartTime());
    ...
  }
}

“最简单”是一个可操作的术语,还有其他方法可以实现这一点,其中最重要的是弄清楚如何完全避免异步这样做。多线程这个只是处理一些命令参数对我来说似乎有些过分。只是说'