2016-09-14 11 views
0

実行するスレッドを10個作成したプログラムがあります。完了する前にすべてが完了するまで、メインスレッドが待機するようにします。 .joinコマンドを使用しようとしていますが、動作していないようです。また、すべてのスレッドのランタイムを表示しようとしていますが、正しく動作していません。以下は私のコードです。メインスレッドがすべてのスレッドが完了するのを待つ方法

//File: CohanThread.java 
//Author: Ryan A. Cohan 
//Date: August 4, 2016 
//Purpose: To create, run, and analyze a thread based program. IOBound runs IO intensive 
//operations in the form of printing 1000 times to the console. CPUBound runs CPU 
//intensive operations by computing an equation and printing 1000 times. 

package cohanthread; 

import java.text.*; 

public class CohanThread{ 

    public static void main(String args[]) throws InterruptedException{ 
     NumberFormat formatter = new DecimalFormat("#0.00000"); 

     IOBound io1 = new IOBound(); 
     IOBound io2 = new IOBound(); 
     IOBound io3 = new IOBound(); 
     IOBound io4 = new IOBound(); 
     IOBound io5 = new IOBound(); 

     CPUBound cpu1 = new CPUBound(); 
     CPUBound cpu2 = new CPUBound(); 
     CPUBound cpu3 = new CPUBound(); 
     CPUBound cpu4 = new CPUBound(); 
     CPUBound cpu5 = new CPUBound(); 

     long scheduleStart = System.currentTimeMillis(); 
     io1.start(); 
     io2.join(); 
     io3.join(); 
     io4.join(); 
     io5.join(); 
     cpu1.join(); 
     cpu2.join(); 
     cpu3.join(); 
     cpu4.join(); 
     cpu5.join(); 
     long scheduleEnd = System.currentTimeMillis(); 
     System.out.println("Runtime of all threads: " + formatter.format((scheduleEnd - scheduleStart)/1000d)); 
     System.out.println("Processes complete."); 
    } 
} 

class IOBound extends Thread{ 
    NumberFormat formatter = new DecimalFormat("#0.00000"); 
    @Override 
    public void run(){ 
     long start = System.currentTimeMillis(); 
     for(int i = 0; i < 1000; i++){ 
      System.out.println("Thread number is: " + i); 
     } 
     long end = System.currentTimeMillis(); 
     System.out.println("IO Thread runtime: " + formatter.format((end - start)/1000d)); 
    } 
} 

class CPUBound extends Thread{ 
    NumberFormat formatter = new DecimalFormat("#0.00000"); 
    @Override 
    public void run(){ 
     String binary = ""; 
     long start = System.currentTimeMillis(); 
     for(int i = 0; i < 1000; i++){ 
      while(i > 0){ 
       int remainder = i % 2; 
       binary = remainder + binary; 
       i = i/2; 
      } 
      System.out.println("Binary number: " + binary); 
      long end = System.currentTimeMillis(); 
      System.out.println("CPU Thread runtime: " + formatter.format((end - start)/1000d)); 
     } 
    } 
} 
+1

"動作していないようです" --- 'join()'は指定どおりに動作します。 –

+0

あなたは未起動のスレッドに参加していますか?それ以外:「うまくいかない」というのは、十分なエラー記述ではありません。あなたが観察するものとは対照的に、あなたが期待するものを提供してください。 – Fildor

+0

あなたは1つのスレッドを開始し、実際に起動したスレッド以外のすべてのスレッドに参加します。 –

答えて

0

https://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

使用このメイン...あなたはすべてのスレッドを開始し、完了を待つ参加を使用する必要があり、計算を開始しません....

public static void main(String args[]) throws InterruptedException{ 
    NumberFormat formatter = new DecimalFormat("#0.00000"); 

    IOBound io1 = new IOBound(); 
    IOBound io2 = new IOBound(); 
    IOBound io3 = new IOBound(); 
    IOBound io4 = new IOBound(); 
    IOBound io5 = new IOBound(); 

    CPUBound cpu1 = new CPUBound(); 
    CPUBound cpu2 = new CPUBound(); 
    CPUBound cpu3 = new CPUBound(); 
    CPUBound cpu4 = new CPUBound(); 
    CPUBound cpu5 = new CPUBound(); 

    long scheduleStart = System.currentTimeMillis(); 
    io1.start(); 
    io2.start(); 
    io3.start(); 
    io4.start(); 
    io5.start(); 
    cpu1.start(); 
    cpu2.start(); 
    cpu3.start(); 
    cpu4.start(); 
    cpu5.start(); 


    io1.join(); 
    io2.join(); 
    io3.join(); 
    io4.join(); 
    io5.join(); 
    cpu1.join(); 
    cpu2.join(); 
    cpu3.join(); 
    cpu4.join(); 
    cpu5.join(); 
    long scheduleEnd = System.currentTimeMillis(); 
    System.out.println("Runtime of all threads: " + formatter.format((scheduleEnd - scheduleStart)/1000d)); 
    System.out.println("Processes complete."); 
} 
+0

これは魅力的に機能しました。私はすべてのスレッドを初期化しないと思っていたのか分かりません。どうもありがとうございました。 –

0
に参加します

java java.util.concurrentパッケージを使用できます。

public static void main(String[] args) { 
     ExecutorService executor = Executors.newFixedThreadPool(10); 
     List<Future<?>> futureList = new ArrayList<>(); 
     futureList.add(executor.submit(new IOBound())); 
     futureList.add(executor.submit(new IOBound())); 
     futureList.add(executor.submit(new IOBound())); 
     futureList.add(executor.submit(new IOBound())); 
     futureList.add(executor.submit(new IOBound())); 

     futureList.add(executor.submit(new CPUBound())); 
     futureList.add(executor.submit(new CPUBound())); 
     futureList.add(executor.submit(new CPUBound())); 
     futureList.add(executor.submit(new CPUBound())); 
     futureList.add(executor.submit(new CPUBound())); 

     for (Future future:futureList) { 
      try { 
       //this method will blocking until task finished 
       future.get(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
0

実行者サービスが行く方法です!

Executorサービスは、ここで実行するスレッドのリストとともに使用できます。

私はExecutor Serviceを使用するようにプログラムを更新しました。

import java.text.*; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

public class CohanThread{ 

    public static void main(String args[]) throws InterruptedException{ 
     NumberFormat formatter = new DecimalFormat("#0.00000"); 

     ExecutorService es = Executors.newFixedThreadPool(5); 
     List<Callable<Object>> threadList = new ArrayList<Callable<Object>>(); 

     IOBound io1 = new IOBound(); 
     IOBound io2 = new IOBound(); 
     IOBound io3 = new IOBound(); 
     IOBound io4 = new IOBound(); 
     IOBound io5 = new IOBound(); 
     threadList.add(Executors.callable(io1)); 
     threadList.add(Executors.callable(io2)); 
     threadList.add(Executors.callable(io3)); 
     threadList.add(Executors.callable(io4)); 
     threadList.add(Executors.callable(io5)); 

     CPUBound cpu1 = new CPUBound(); 
     CPUBound cpu2 = new CPUBound(); 
     CPUBound cpu3 = new CPUBound(); 
     CPUBound cpu4 = new CPUBound(); 
     CPUBound cpu5 = new CPUBound(); 
     threadList.add(Executors.callable(cpu1)); 
     threadList.add(Executors.callable(cpu2)); 
     threadList.add(Executors.callable(cpu3)); 
     threadList.add(Executors.callable(cpu4)); 
     threadList.add(Executors.callable(cpu5)); 

     long scheduleStart = System.currentTimeMillis(); 
     List<Future<Object>> results = es.invokeAll(threadList); 
     long scheduleEnd = System.currentTimeMillis(); 
     System.out.println("Runtime of all threads: " + formatter.format((scheduleEnd - scheduleStart)/1000d)); 
     System.out.println("Processes complete."); 
    } 
} 

class IOBound extends Thread{ 
    NumberFormat formatter = new DecimalFormat("#0.00000"); 
    @Override 
    public void run(){ 
     long start = System.currentTimeMillis(); 
     for(int i = 0; i < 1000; i++){ 
      System.out.println("Thread number is: " + i); 
     } 
     long end = System.currentTimeMillis(); 
     System.out.println("IO Thread runtime: " + formatter.format((end - start)/1000d)); 
    } 
} 

class CPUBound extends Thread{ 
    NumberFormat formatter = new DecimalFormat("#0.00000"); 
    @Override 
    public void run(){ 
     String binary = ""; 
     long start = System.currentTimeMillis(); 
     for(int i = 0; i < 1000; i++){ 
      while(i > 0){ 
       int remainder = i % 2; 
       binary = remainder + binary; 
       i = i/2; 
      } 
      System.out.println("Binary number: " + binary); 
      long end = System.currentTimeMillis(); 
      System.out.println("CPU Thread runtime: " + formatter.format((end - start)/1000d)); 
     } 
    } 
} 

List<Future<Object>> answers = es.invokeAll(threadList);は、すべてのスレッドが実行を完了したそれまでは待つことに注意してください。

希望します。ハッピーコーディングの乾杯!