-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 方法中看到的那样,每个线程将运行特定的时间段,并且在特定的时间段内,它将选择有效的用户 id 95% 的时间和剩余的 5% 的时间,它将选择非有效的用户 ID。

我的问题:-

目前我被困在这个问题上,如何确保每个线程将使用 95% 的时间有效用户 ID 和剩余 5% 的时间,它将选择非有效用户 ID。

如果我在任何部分不清楚,请告诉我。任何建议都会对解决这个问题有很大帮助。

4

2 回答 2

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 回答
0

从线程访问成员变量(如 endTime)时要小心。如果变量不是最终的,你应该同步它的访问,或者,如果它只在一个线程中被修改,让它成为瞬态的。

于 2013-02-23T22:04:27.840 回答