1

MySQL と Java スレッドの動作に非常に戸惑っています。これを同期済みとして宣言すると、取得した結果が衝突しています。これは、複数のスレッドが同時に同じ関数にアクセスしていることを意味します。このコード セグメントは実行可能なクラスにあります。MachineID は、for ループで呼び出された順序のスレッド ID です。(これは 1 から 100 までの数字です)。

表は必要な情報ではないと思います

これは私が得る出力です

144 18

144 17

144 11

144 13

144 10

144 9

    public synchronized int getRow() throws SQLException{
        String query="SELECT * FROM Searches WHERE checked='0'";
        ResultSet results = this.database.executeQuery(query);
        int id=0;
        if(results.next()){
            id=results.getInt(1);
            System.out.println(id+" "+this.machineID);
             query = "UPDATE Searches  SET checked='1' WHERE ID_num='"+id+"'";
             System.out.println(this.database.executeUpdate(query));
        }

        return id;
    }
    public void run() {



                int id=getRow();

                if (id!=0) {
}
}

ここでスレッドを呼び出します

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

3 に答える 3

4

メソッドがクラスにgetRow()属していると仮定すると、ブロッキングは行われません。Verifierメソッドで宣言するsynchronizedと、インスタンス自体で同期するのと同じになります。ただし、Verifierそれぞれに対して新しいインスタンスを生成していますThread。それらのそれぞれはそれ自体で同期しているため、他のものをブロックするものはありません。

Lock共有オブジェクトの各インスタンスとオブジェクトを共有するVerifierか、同期することを検討してください。

Object lock = new Object();

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

...
public int getRow() throws SQLException{
    synchronized(lock) {
        ...
    }
}
于 2013-11-15T03:02:47.657 に答える
0

ソティリオスは頭に釘を打ちました。しかし、ロックする新しい変数を用意する代わりに、単一Verifierの のみを使用して、複数のスレッドから呼び出します。だからあなたは持っているでしょう

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

Verifier注 -コンストラクターの 2 番目の引数がどうあるべきかわかりません。実際には必要ない可能性がありますが、実際にはコンストラクターを表示しないため、そのままにしておくことにしました。

于 2013-11-15T03:13:46.497 に答える
0

No synchronization is happening at all it's is similar to

synchronize(this) 

And the same instance is not shared across the threads so there is no synchronization happening at all. So you need to share a lock object across the Runnable instances i.e. Verifier in constructer like:

public class Verifier implements Runnable{
    private final Object lock;
    public Verifier(Object lock){
         this.lock=lock;
    }

Than you can synchronize on the lock like:

synchronize(lock)

else you can synchronize on the class object as well:

synchronize(Verifier.class)
于 2013-11-15T03:16:38.260 に答える