0

each thread私はのために働くコードを持っていて、10 minutesそれは私がどのテーブルに基づいて選ぶことになっているのかを決定しますrandom number。その後、をSQL query使用してそのテーブルに対してを実行していますPreparedStatementresult setそれを実行した後、データがにある場合にのみループして、ResultSetにデータを追加する必要がありList<String> colDataます。

ここでは、コンマで区切られたcolumnsList内容が含まれます。table columns例えば-

col1, col2, col3

以下はコードです-

class ReadTask implements Runnable {

    private static Random random = new SecureRandom();

    public ReadTask() {

    }    


    @Override
    public run() {
      ...

      while ( < 10 minutes) {

        double randomNumber = random.nextDouble() * 100.0;
        ReadTableConnectionInfo tableInfo = selectRandomConnection(randomNumber);

        final int id = generateRandomId(random);
        final String columnsList = getColumns(table.getColumns());
        final String selectSql = "SELECT " + columnsList + "  from " + table.getTableName() + " where id = ?";

        preparedStatement = tableStatement.get(table.getTableName()).prepareCall(selectSql);
        preparedStatement.setString(1, String.valueOf(id));

        rs = preparedStatement.executeQuery();

        List<String> colData = new ArrayList<String>(columnsList.split(",").length);
        boolean foundData = false;

        if (id >= 1 && id <= 5000) {

            if (rs.next()) {
                foundData = true;

                for (String column : columnsList.split(",")) {

                         colData.add(rs.getString(column)); 
                }
                rs.next();//this should return false or an error condition and do I need this here?
            }
        } else if (rs.next()) {
            // do some stuff
         }

        if (flagValidateData && foundData) {

        // iterate through colData map
             }
         }
       }
    }

問題文:-

1)同期が必要colData listかどうか。

2)データを追加する方法List<String> colDataがスレッドセーフかどうか?

3)そして、結果セットをループして追加する方法に他の問題はありますcolData string arrayか?そのため、マルチスレッドコードであるため、競合状態でデバッグするのは困難です。

4

3 に答える 3

3

addメソッドがマルチスレッドセーフであるかどうかは、実装クラスによって異なります。ArrayListはマルチスレッドセーフではありません。ベクトルは同期されます。または、Collections.synchronizedListメソッドを使用してArrayListをラップできます。

于 2013-03-01T01:26:41.357 に答える
2

次のように、任意のListスレッドを安全にすることができます。

List<String> names = new ArrayList<String>(); // not thread safe
List<String> threadSafeNames = Collections.synchronizedList(names);

java.util.concurrentより良い解決策は、のようなからの新しいデータ構造かもしれませんCopyOnWriteArrayList

于 2013-03-01T01:29:30.150 に答える
0

同期データが必要な場合は、同期読み取り/書き込み関数を作成してみませんか?また、コレクションとリストを拡張すると、それらを同期できます

私の母の舌はドイツ語(aut / vie)で、3です...;)

同期は、何かを同期させた場合にデータを上書きしたり、多元接続で置き換えたりできる場合に使用されます。これにより、システムが停止(速度低下)する可能性があります。

同期とは、1つのオブジェクトのみが一部のセクションを処理できることを意味します

スレッドウィッチが何らかのメソッドにアクセスした場合、次のスレッドは、そのスレッドがセクションで終了するまで待機する必要があります

良い例:ストリームを使用して単一のファイルにデータを書き込み、ファイルまたはoutput-connectにデータを書き込む:publicsynchronized void write(OutputStream str、byte toSend []){...}

私は通常、get-next-operation(list-removal、return last element)などのプールテクニックに同期を使用します

18時間の仕事にうんざりしている;)

私はちょうど言います:

同期する必要があるものは何でも、そのための関数を記述します。

public synchronized void colData_add(final String str) // or object or whatever
{
...
}

public synchronized String colData_nextElement()
{
return colData.remove();
}

このhelpzを願っています

于 2013-03-01T02:13:06.820 に答える