0

そのようなコードが安全かどうかはわかりません。DBから名前を読み取る必要があります。たとえば、10個のスレッドを使用する必要があります。各スレッドは名前を取り、その中でrunこの名前を引数として必要とする関数を呼び出します。

10スレッドは8GBのRAMを搭載したIntelコアi7を実行しているPCに適した数ですか?作成できるスレッドの許容数を知るにはどうすればよいですか?このコードは正しく安全ですか?

私はディーテルの本で、彼らがエグゼキューターの前に新しいスレッドを作成していることを発見しました。彼らは次のような行を追加します:PrintTask task1 = new PrintTask( "thread1" );

チェック:http ://www.deitel.com/articles/java_tutorials/20051126/JavaMultithreading_Tutorial_Part4.html )、ただし、以下のメソッド(新しいステートメントなし)をhttp://www.vogella.com/articles/JavaConcurrency/で見つけてください。 article.html

つまり、ループの前に作成する必要がありますか?2つの参照は異なる方法を使用しており、私は混乱しています。正しいコードは次のとおりです。

        ExecutorService Executor = Executors.newFixedThreadPool(10);

        while(resultSet.next()) 
           {
              name=resultSet.getString("hname");
              MyRunnable worker = new  MyRunnable(name);

               Executor.execute( worker );
               Counter++;
        }


     Executor.shutdown();
     System.out.println("thread shutdown");

// Wait until all threads are finish
while (! Executor.isTerminated()) {

}
System.out.println("Finished all threads");

また

MyRunnable task1 = new MyRunnable(name );
MyRunnable task2 = new MyRunnable(name );
MyRunnable task3 = new MyRunnable(name );
MyRunnable task4 = new MyRunnable(name );
MyRunnable task5 = new MyRunnable(name );
MyRunnable task6 = new MyRunnable(name );
MyRunnable task7 = new MyRunnable(name );
MyRunnable task8 = new MyRunnable(name );
MyRunnable task9 = new MyRunnable(name );
MyRunnable task10 = new MyRunnable(name );


        ExecutorService Executor = Executors.newFixedThreadPool(10);

        while(resultSet.next()) 
           {
              name=resultSet.getString("hname");
              MyRunnable worker = new  MyRunnable(name);

               Executor.execute( worker );
               Counter++;
        }


     Executor.shutdown();
     System.out.println("thread shutdown");

// Wait until all threads are finish
while (! Executor.isTerminated()) {

}
System.out.println("Finished all threads");

また、runを実装するMyRunnableクラスのコンストラクターで、スレッドを明示的に開始する必要がありますか、それともExecutor.execute( worker )この場合は十分に実行しますか。

4

2 に答える 2

3

私はそれを次のように書き直したでしょう:

ExecutorService executor = Executors.newFixedThreadPool(10);

while(resultSet.next())
{
    name=resultSet.getString("hname");
    MyRunnable worker = new  MyRunnable(name);
    executor.submit(worker);
    counter++;
}


executor.shutdown();
System.out.println("thread shutdown");

executor.awaitTermination(60, TimeUnit.SECONDS);
System.out.println("Finished all threads");

小文字の変数、ループの代わりにawaitTermination。

使用するスレッドの数は、マシン、実行するタスクの数、タスクの「サイズ」など、いくつかの要因によって異なります。

于 2012-07-09T05:03:34.480 に答える
0

それがあなたの懸念であるならば、あなたの最初のループについてスレッドセーフなものは何もありません。私の唯一の懸念は、あなたがそのCounter変数を何のために使うかということです:あなたはあなたがあなたのsの中のその値に頼ることができないことを知っていますよMyRunnableね?

于 2012-07-09T04:59:40.493 に答える