0

職場でのトレーニングでは、次の基準を満たすJava(経験が0)プログラムを作成しています。

分散コンピューティングアプリケーションを複製するプログラムを作成する

M個の乱数のリストを含む中央の「スケジューラー」オブジェクトを作成します

スケジューラーから番号を取得するN個のプロセッサー・スレッドを作成し、それを何度もループしてから、別の番号を要求します

スケジューラから利用できる番号がない場合は、別の番号を要求するのを待ちます。

数字が残っていない場合は、すべてのスレッドが終了するはずです。

これまで、乱数の配列を使用してオブジェクトを作成しましたが、マルチスレッドを続行する方法が本当にわかりません。誰かが私にそれを案内してもらえますか?これは、擬似コードを示すコメントとともに、私がこれまでに持っているものです。

public class ThreadDemo extends Thread
{
    //create new array of arbitrary size 5
    static int SIZE = 5;
    static int[] myIntArray = new int[SIZE];
    
    
    public ThreadDemo()
    {
        start();
    }
    
    class RunnableThread implements Runnable {

        Thread runner;
        public RunnableThread() {
        }
        public RunnableThread(String threadName) {
            runner = new Thread(this, threadName); // (1) Create a new thread.
            System.out.println(runner.getName());
            runner.start(); // (2) Start the thread.
        }
        public void run() {
            //Display info about this particular thread
            System.out.println(Thread.currentThread());
        }
    }

    
    public static void main(String[] args)
    {
        for(int i=0; i<SIZE; i++)
        {
            myIntArray[i] = (int)(Math.random() * 10);
        }
        
        ThreadDemo scheduler = new ThreadDemo();
        
        //create M processor threads that retrieve number from scheduler
            //for(int i=0; i<SIZE; i++)
                //
        
        //if no threads available
            //make the scheduler thread wait() ??
        
        //if empty
            //stop() the scheduler thread ??
        
    }

    }

誰かが私を正しい方向に導くことができますか?

ありがとうございました!

4

4 に答える 4

2

これは、開始するのに適した場所です。ITは、エグゼキュータサービスの調査にも役立ちます。これが例です。

また、並行コレクションのいくつかを確認することもできます。配列の代わりにキューを使用する価値があるかもしれないので、何かがキューから引き出されたときにそれを知るのは少しきれいです。

于 2012-07-06T12:54:02.383 に答える
2

Runnable最初のポインタとして:コンストラクターでスレッドを開始したり、オブジェクトを使用してそれ自体を使用してスレッドを開始したりしないでください。コードを読む人にとっては非常に混乱します。

これがこの問題に対する私の見解です(私が夢中にならないことを願っています):

class Scheduler {
    private int[] numbers;
    private AtomicInteger current = new AtomicInteger();

    public Scheduler(int count) {
        Random rand = new Random();
        numbers = new int[count];
        for(int i = 0; i < count; i++) {
            numbers[i] = rand.nextInt();
            if(numbers[i] < 0) numbers[i] *= -1;
        }   
    }

    public int getNextNumber() {
        int local = current.incrementAndGet();
        if(local >= numbers.length) {
            return -1;
        }
        return numbers[local];
    }
}

まず、Schedulerランダムな(正の)整数の配列を保持し、アトミックにインクリメントするカウンターに基づいて、オンデマンドで配列から数値を返すクラスを定義します。

class Task implements Runnable {

    private Scheduler scheduler;  

    public Task(Scheduler scheduler) {
        this.scheduler = scheduler;     
    }

    public void run() {
        while(true) {           
            int limit = scheduler.getNextNumber(); // get next number
            if(limit == -1) return; // no more numbers
            System.out.println(limit);
            for(int i = 0; i < limit; i++) {
                // spin
            }
        }
    }       
}

このTaskクラスは、各スレッドが実行するコードを保持します。各スレッドSchedulerは、配列が使い果たされるまで、から番号を要求して無期限にループします。

public class Test {

    public static void main(String[] args) throws InterruptedException {

        Scheduler s = new Scheduler(100);
        ExecutorService exec = Executors.newFixedThreadPool(4);
        for(int i = 0; i < 4; i++) {
            exec.submit(new Task(s));
        }

        exec.shutdown();
        exec.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);       
    }
}

メインクラスでは、スレッドプールを設定し、4つのスレッドを実行して前述のタスクを実行します。

于 2012-07-06T13:11:36.200 に答える
1

ThreadPoolExecutorをご覧になることをお勧めします

あなたはこのようなものになってしまうはずです。

public static void main(){
    ThreadPoolExecutor tpe = new ThreadPoolExecutor(...);
    List<Integer> numbers = getNumberList();
    for(Integer i : numbers){
    tpe.submit(new MyRunnable(i) {
            Integer i;
            public MyRunnable(Integer i){
              this.i=i;
            }
        @Override
        public void run() {
         dosomethingWith(i);
        }
      }
   }

}

于 2012-07-06T12:53:51.227 に答える
1

あなたの宿題についての私の理解によると、あなたはプロデューサーとワーカーのスレッドユニットを作成する必要があります。要件に合った以下のリンクを参照してください。

http://www.exampledepot.com/egs/java.lang/WorkQueue.html

ありがとうThanikachalan

于 2012-07-06T12:58:14.863 に答える