2016-09-14 96 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

你開始一個線程,並加入除了你真正開始的線程之外的所有其他線程。 –

回答

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

ExecutorService是要走的路!

您可以在此處使用執行程序服務以及要執行的線程列表。

我已更新程序以使用Executor服務。

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);將等待直到所有線程完成執行。

希望它有幫助。快樂編碼乾杯!