1

質問に関連: Java Threading with MYSQL puzzled

カウンター int は同期されますが、executeQuery への関数呼び出しは同期されません。私が得ている結果

カウンター: 1

MYSQL からの行: 1

カウンター: 2

MYSQL からの行: 1

カウンター:3

MYSQL からの行: 1

予期される出力 -> MYSQL からの行: カウンターと同じである必要があります

すべてのスレッドは、最初のクエリと同時に実行されます。したがって、それらは結果の同じ ID を取得します。ただし、それらはカウンター反復のために同期します。私にはこれはばかげています。この動作は文書化されていますか? どうすればバイパスできますか?Verifier.java

public void run() {

int id = 0;
    String query = "SELECT ID_num FROM Searches WHERE checked='0'";
    ResultSet results;
    synchronized (this.database) {
        results = this.database.executeQuery(query);
        if (results.next()) {
            id = results.getInt(1);
            query = "UPDATE Searches  SET checked='1' WHERE ID_num='"
                    + id + "'";
            this.database.counter++;
            System.out.println(this.database.counter);
            System.out.println(id);

        }
    }
}

Core.java

for (int i = 0; i < verifier.length; i++) {
            MySQL database=new MySQL();
           verifier[i]=new Thread(new Verifier(database,i+1));  
            verifier[i].start(); 
    }

MySQL.java

public class MySQL{
    int counter=0;
....

}
4

1 に答える 1

1

編集:問題が発生しました。更新クエリが結果をコミットしていません。更新後にコミットすると、テーブル数も変更されることがわかります。

EDIT2:OPは言う

予期される出力 -> MYSQL からの行: カウンターと同じである必要があります

しかし、現在のコードではこれを達成することはできません。プログラムのロジックは次のとおりです。

  1. ですべての行をフェッチしますchecked='0'
  2. スレッドは、フェッチされたすべての行を更新しますchecked='1'
  3. checked='0'2番目のスレッドが来て、最初のスレッドが行をコミットすると常に0になる行を見つけようとします。

この動作を実現するために、スレッド カウント [ Verifier に渡される値] checked='0'から派生する代わりに、クエリでハード コードする必要はありません。i

EDIT3: ここに修正がありdatabaseます。スレッドごとに新しいスレッドが作成されるため、スレッドは順次実行されません。上記の点は依然として当てはまりますが、これにより、期待される結果を達成することがより困難になります。

于 2013-11-15T04:47:15.763 に答える