1

私はブラックベリー用のJavaでスレッドプールを開発しています。これは私が現在持っているコードです:

public class ThreadPool {

    int maxWorkers = 15;
    Vector queue = new Vector();
    Thread[] workers;

    public ThreadPool(int maxThreads) {



        if (maxThreads <= maxWorkers)
            maxWorkers = maxThreads;

        workers = new Thread[maxThreads];


        for (int i = 0; i < maxThreads; i++) {

            // Crea un worker que ejecuta trabajos.
            workers[i] = new Thread(new Runnable() {

                public void run() {

                    Runnable r;

                    while (true) {

                        synchronized (queue) {

                            while (queue.size() == 0) {
                                try {
                                    queue.wait();
                                } catch (Exception e) {
                                    System.out.println("Error while waiting");
                                }
                            }

                            try {

                                r = (Runnable) queue.firstElement();
                                queue.removeElement(r);
                                r.run();
                                queue.notify();
                            } catch (Throwable e) {
                                System.out.println("nope!");
                            }
                        }
                    }
                }
            });


            workers[i].start();
        }
    }

    public void addWork(Runnable work) {

        synchronized (queue) {
            queue.addElement(work);
            queue.notify();
        }
    }
}

問題は、10個のジョブをキューに入れると、それらが同時に実行されるのではなく、次々に実行されることです。たとえば、次のようになります。

 for (int i=0; i<10; i++) {
        pool.addWork(new Runnable() {

                public void run() {

                    Random random = new Random();
                    int time = random.nextInt(5) * 1000;


                                System.out.println("I'm work " + i);

                    try {                   
                        Thread.sleep(time);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
     }

そして私は得る:

I'm work 1
I'm work 2
I'm work 3
...
4

1 に答える 1

2

r.run()キュー同期ステートメント内でジョブ (つまり) を実行しているため、各スレッドがそのジョブを完了するまで、キュー ロックは解放されません。同期ステートメントの外でジョブを実行する必要があります。それを試してみてください。

于 2013-02-25T19:34:41.667 に答える