-1

ファイルからいくつかのプロパティを読み取ることになっているプロジェクトに取り組んでいます。以下は私のプロパティファイルです-

NUMBER_OF_THREADS: 10
RANGE_VALID_USER_ID: 1-5000
RANGE_NON_VALID_USER_ID: 10000-50000
PERCENTAGE_VALID_USER_ID: 95

これは、上記のプロパティから、number of threadsis 10、次に range of valid user id'sis from 1 to 5000、および range of non valid user idis fromであることを意味します10000-50000。最も重要なことは95% of time、各スレッドが有効なユーザー ID 範囲から ID を選択する必要があることです。つまり、有効5% of timeでないユーザー ID 範囲から ID を選択するということです。 .

以下は私が書いた私のプログラムです。上記のプロパティファイルを読み込みます。

private static Properties prop = new Properties();
private static int threads;
private static int startValidRange;
private static int endValidRange;
private static int startNonValidRange;
private static int endNonValidRange;
private static double percentageValidId;

public static void main(String[] args) {

    // create thread pool with given size
    ExecutorService service = Executors.newFixedThreadPool(threads);

    try {
        readPropertyFile();

        for (int i = 0; i < threads; i++) {
            service.submit(new ReadTask());
        }

    } catch (InterruptedException e) {

    } catch (IOException e) {

    }
}

private static void readPropertyFile() throws IOException {

    prop.load(Read.class.getClassLoader().getResourceAsStream("config.properties"));

    threads = Integer.parseInt(prop.getProperty("NUMBER_OF_THREADS"));

    startValidRange = Integer.parseInt(prop.getProperty("RANGE_VALID_USER_ID").split("-")[0]);
    endValidRange = Integer.parseInt(prop.getProperty("RANGE_VALID_USER_ID").split("-")[1]);

    startNonValidRange = Integer.parseInt(prop.getProperty("RANGE_NON_VALID_USER_ID").split("-")[0]);
    endNonValidRange = Integer.parseInt(prop.getProperty("RANGE_NON_VALID_USER_ID").split("-")[1]);

    percentageValidId = Double.parseDouble(prop.getProperty("PERCENTAGE_VALID_USER_ID"));
}

以下はReadTask class実装する私のものRunnable Interfaceです。

class ReadTask implements Runnable {

    public ReadTask() {
    }

    @Override
    public void run() {

    long startTime = System.currentTimeMillis();
    long endTime = startTime + (durationOfRun*60*1000);    

    while (System.currentTimeMillis() <= endTime) {

    /* Print valid user id 95% of time 
     * and remaining 5% of time it will print 
     * non valid user id.
     */

        }
    }
}

現在私の run メソッドでわかるように、各スレッドは特定の期間実行され、その特定の期間に、95% の時間で有効なユーザー ID を選択し、残りの 5% の時間で非選択を選択します。有効なユーザー ID。

私の質問:-

現在、私はこの問題に悩まされています。各スレッドが有効なユーザー ID の 95% を使用し、残りの 5% を使用するようにする方法は、無効なユーザー ID を選択します。

どの部分でも明確でない場合はお知らせください。どんな提案でも、この問題を解決するのに大いに役立ちます。

4

2 に答える 2

0

スレッドから endTime などのメンバー変数にアクセスするときは注意してください。変数が final でない場合は、そのアクセスを同期するか、1 つのスレッドでのみ変更される場合は、変数を一時的にする必要があります。

于 2013-02-23T22:04:27.840 に答える
0

選択したデータ構造に問題がない場合は、静的フィールドにアクセスできることを確認してReadTaskください(public/「パッケージ保護」にするかReadTask、内部クラスを作成することにより)。番号を選択するには、まず「有効」または「無効」の間で選択をランダム化します (@bmorris591 の提案に従って)。次に、ランダムな整数を取得しますが、間隔に合わせて「シフト」します。

Random r = new SecureRandom();
while (System.currentTimeMillis() <= endTime) {
    int randomID;
    if ( r.nextFloat() < percentageValidId/100 )
        randomID = r.nextInt(endValidRange - startValidRange + 1) + startValidRange;
    else
        randomID = r.nextInt(endNonValidRange - startNonValidRange + 1) + startNonValidRange;
    // Print it
}
于 2013-02-23T21:48:07.433 に答える