2

Javaでのスレッド化がどのように機能するかを理解しようとしています.実行可能なスレッドをすべて配列に配置することで実行を制限し、それらのいくつかが終了してポップアウトした場合はループをチェックインして、新しいスレッドを生成する可能性を持たせ、例外を取得したいだけです.このコードでは:

public class testThread implements Runnable {
public void run () {
        try {
            Thread.sleep(1000);
        } catch(InterruptedException e){}
        System.out.println("This is the test thread");
    }   

    public static void main (String args[]) {
        int max_threads = 5;
        Thread worker;
        ArrayList<Thread> all_workers = new ArrayList<Thread>(max_threads   );
        for (int i =0; i<50; i++) {
            if (all_workers.size()<max_threads){
                worker = new Thread (new testThread());
                all_workers.add(worker);
                worker.start(); 
            } else{
                System.out.println("i ran all");
                while(all_workers.size()>=max_threads){
                    try{ 
                        System.out.println("Waiting for some to finish");
                        int counter = 0;
                        for (Thread wrk: all_workers){
                            if (!wrk.isAlive()){
                                all_workers.remove(counter);
                            }
                            counter ++ ;
                        }
                        Thread.sleep(500);
                    } catch (InterruptedException e){
                        System.out.println("Catched unhandled ");
                    }
                }
            }
        }

        for(Thread wrk: all_workers){
            try {
                wrk.join();
            } catch (InterruptedException e) {
            }
        }
    }
}

実行時に例外が発生しました:

anybody@anymachine ~/java $ java testThread 
i ran all
Waiting for some to finish
Waiting for some to finish
This is the test thread
This is the test thread
This is the test thread
This is the test thread
This is the test thread
Waiting for some to finish
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
    at java.util.ArrayList$Itr.next(ArrayList.java:791)
    at testThread.main(testThread.java:39)

助けてくれてありがとう、良いチュートリアルがあれば、リンクに大いに感謝します。

PS。Python の pdb のような Java のデバッガがあれば教えてください。ありがとう!

4

4 に答える 4

7

ExecutorService や ThreadPools などの高レベルのスレッド化ユーティリティを確認する必要があります。

スレッドを手動で終了するべきではありません。スレッドの手動作成/管理は一般的に避けることをお勧めします。

多数のスレッドが終了するのを待ちたい場合は、CountDownLatch を使用することをお勧めします。ここに例があります。

于 2013-10-15T16:49:10.107 に答える
6

スレッド「メイン」での例外 java.util.ConcurrentModificationException

ArrayListこれは、反復処理中にから削除しているためです。これは許可されていません。

for (Thread wrk : all_workers) {
   if (!wrk.isAlive()) {
      // ERROR, you can't change the collection while you are in a for loop
      all_workers.remove(counter);
   }
   ...

歩いているリストから削除する必要がある場合は、iterator.remove()代わりに次を使用する必要があります。

Iterator<Thread> iterator = all_workers.iterator();
while (interator.hasNext()) {
    Thread wrk = interator.next();
    if (!wrk.isAlive()) {
        // this is allowed because you are using the iterator directly
        iterator.remove();
    }
}

特定の状況に対するより良い解決策は、ExecutorServiceコードを使用することです。次に、固定スレッド プールを作成し、そこにジョブを送信します。

// create a thread pool with 5 worker threads
ExecutorService threadPool = Executors.newFixedThreadPool(5);
// define your jobs somehow
for (int i = 0; i < 50; i++) {
    threadPool.submit(new testThread());
}
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
// then wait for it to complete
threadPool.awaitTermination(Long.MAX_LONG, TimeUnit.MILLISECONDS);
于 2013-10-15T17:11:01.670 に答える
1

まず、実行中のスレッドの数を制限する必要があるのはなぜですか? いずれにせよ、コンピュータはプロセッサの数よりも多くのスレッドを同時に実行できないことに注意してください。

あなたのソリューションの主な欠点はThread.sleep(500). 不要なレイテンシが発生します。

適切な解決策はjava.util.Executor、必要な数のスレッドで を使用することです。executor.execute(new testThread())次に、代わりに呼び出すだけですnew Thread (new testThread()).start()

于 2013-10-15T17:33:10.123 に答える
0

下の行を変更します

ArrayList<Thread> all_workers = new ArrayList<Thread>(max_threads);

Set<Thread> all_workers =  Collections.newSetFromMap(new ConcurrentHashMap<Thread,Boolean>())
于 2013-10-15T17:02:43.670 に答える