3

設定ファイル

ThreadSize = 10
StartRange = 1
EndRange = 1000

上記の構成ファイルには、使用したいスレッドの数があり、クライアント インスタンスは 1 から 1000 の ID 範囲を使用でき、クライアント スレッドが 10 に設定されていると仮定すると、各スレッドは 100 個の ID の範囲を持つことになります。 (基本的にはエンド範囲をスレッドサイズで分割することで)他のスレッドを踏まずに使用できます。だから私が望むのは、各スレッドが他のスレッドを踏まずにその範囲から100個のIDを使用することです-たとえば

Thread1 will use 1 to 100 (id's)
// generate a random number between 1 to 100 and keep on printing values until it has generated all the random values between 1 to 100
Thread2 will use 101 to 200 (id's)
// generate a random number between 101 to 200 and keep on printing values until it has generated all the random values between 101 to 200
Thread3 will use 201 to 300 (id's)
// generate a random number between 201 to 300 and keep on printing values until it has generated all the random values between 201 to 300

-----
----
Thread10 will use 901 to 1000
// generate a random number between 901 to 1000 and keep on printing values until it has generated all the random values between 901 to 1000

マルチスレッド プログラムの作成方法は知っていますが、さまざまなスレッド間で範囲を分割する方法がわかりません。

public static void main(String[] args) {

    for (int i = 1; i <= threadSize; i++) {
        new Thread(new ThreadTask(i)).start();
    }
}


class ThreadTask implements Runnable {
    private int id;

    public ThreadTask(int id) {
    this.id = id;
    }

    public synchronized void run() {

    }
}
4

2 に答える 2

4

各スレッドはN = (EndRange - StartRange + 1) / ThreadSize番号を取得します。

スレッド番号iは range を取得します(StartRange + i*N) - (StartRange + i*N + N - 1)

あなたの例ではN = (1000 - 1 + 1) / 10 = 100

スレッドi = 0は範囲を取得します(1 + 0*100) - (1 + 0*100 + 100 - 1)=1 - 100

スレッドi = 1は範囲を取得します(1 + 1*100) - (1 + 1*100 + 100 - 1)=101 - 200

...

于 2012-05-16T23:06:49.353 に答える
0
public class MyThread extends Thread {
    public static final int TOTAL_THREADS = 10;
    public static final int START_RANGE = 1;
    public static final int END_RANGE = 1000;
    public static final int N = (END_RANGE - START_RANGE + 1) / TOTAL_THREADS;
    int threadNo;
    static volatile int counter = 1;
    public final static Object obj = new Object();

    public MyThread(int threadNo) {
        this.threadNo = threadNo;
    }

    @Override
    public void run() {
        synchronized (obj) {
            while (counter <= 1000) {
                if (counter >= (START_RANGE + threadNo * N) && counter <= (START_RANGE + threadNo * N + N - 1)) {
                    System.out.println((this.threadNo + 1) + " prints " + counter++);
                    obj.notifyAll();
                } else {
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String args[]) {
        for (int i = 0; i < TOTAL_THREADS; i++) {
            System.out.println("Call thread : " + (i + 1));
            MyThread th = new MyThread(i);
            th.start();
        }
    }
}
于 2022-01-25T18:35:09.157 に答える