2017-03-21 16 views
0

hereまたはhereのような質問がいくつかあり、余分なスレッドがパフォーマンスを低下させる理由を尋ねます。私はそれらを得る。1つの余分なスレッドが大幅にパフォーマンスを向上させる

私は多少反対の質問があります.1つの余分なスレッドだけでは、どのようにしてパフォーマンスが向上するのでしょうか? 10または20?

コード例:スレッドのない

  public class MainThreaded { 

    public static void main(String[] 

     String filePath = "my\\path\\"; 

     String[] inFiles = {filePath+"file1.txt",filePath+"file2.txt"}; 
     String[] outFiles = {filePath + "file1Out.txt", filePath + "file2Out.txt"}; 

     long startTime = System.currentTimeMillis(); 

      for (int i = 0; i < inFiles.length; i++) { 

       Adder adder = new Adder(inFiles[i], outFiles[i]); 
//    adder.doAdd(); 
       Thread thread = new Thread(adder); 
       thread.start(); 
      } 

     long endTime = System.currentTimeMillis(); 
     long totalTime = endTime - startTime; 
     System.out.println("That took " + totalTime+ " milliseconds"); 


    } 

} 



public class MainNoThread { 

    public static void main(String[] args) { 


     String filePath = "my\\path\\";  
     String[] inFiles = {filePath+"file1.txt",filePath+"file2.txt"}; 
     String[] outFiles = {filePath + "file1Out.txt", filePath + "file2Out.txt"}; 

     long startTime = System.currentTimeMillis(); 

      for (int i = 0; i < inFiles.length; i++) { 

       Adder adder = new Adder(inFiles[i], outFiles[i]); 
       try { 
        adder.doAdd(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 

     long endTime = System.currentTimeMillis(); 
     long totalTime = endTime - startTime; 
     System.out.println("That took " + totalTime+ " milliseconds"); 

    } 

} 

public class Adder implements Runnable { 

    private String inFile, outFile; 

    public Adder(String inFile, String outFile){ 
     this.inFile = inFile; 
     this.outFile = outFile; 

    } 

    public void doAdd() throws IOException{ 

     int lines = 0; 

     try(BufferedReader reader = Files.newBufferedReader(Paths.get(inFile))){ 
      while (reader.readLine() != null) { 
       lines++; 
      } 
      try(BufferedWriter writer = Files.newBufferedWriter(Paths.get(outFile))){ 
       writer.write("Total: " + lines); 
      } 
     } 

    } 

    @Override 
    public void run() { 

     try { 
      doAdd(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
  • 第一アプリは約かかります40ミリ秒
  • new Thread()の1つだけを追加する第2のバージョンは2ミリ秒かかります。

私の質問:このような劇的な改善の背景は何ですか?

+0

本当にスレッドが終了するのを待っていますか?コードを表示できますか? – Justas

+1

ディスクキャッシュを考慮しましたか? – selbie

+1

2番目のバージョンはどのように実装しましたか?両方のコードを見ることなく、何が起こるかを知ることは難しいです。おそらくあなたは最初にシングルスレッドを実行し、2番目のスレッドが実行されると、ファイルはすでにシステムのファイルシステムのキャッシュに入っていますか? – Axel

答えて

1

thread.start()を呼び出すと、スレッドは移動する前にスレッドが処理を終了するのを待たずに進みます。 start()は「非ブロッキング」または「非同期」メソッドと呼ばれるものです。

この時間を正確に計測するには、時間を計測する前にスレッドが終了するのを待つ必要があります。これを行う1つの方法は、作成したすべてのスレッドを追跡し、最後にスレッドごとに「thread.join()」を呼び出すことです。 Thread.join()は、スレッドが終了してから続行するのをブロック(待機)します。

関連する問題