2012-01-27 23 views
4

このファイルで私を助けてくれることを願っています。 複数のスレッドを使ってテキストファイルに書き込むプログラムを作る必要があります。 私が必要としているのは、プロセッサがスレッドやその他のスレッドに "注意"を与える方法を示すことです。つまり、基本的に、同時に実行しているすべてのスレッドと、同時に書き込みを行う必要があります。マルチスレッドのテキストファイルへの書き込み

ここに私のコードです。

方法1: "for"を使用してスレッドを作成および開始する。

public class ThreadGenerator { 

    public static void main(String[] args) { 

     File textFile = new File("c:\\threadLog.txt"); 

     try { 
      PrintWriter out = new PrintWriter(new FileWriter(textFile)); 

      for (int index = 0; index < 5; index++) { 

      ThreadCustom thread = new ThreadCustom("ID" + index, out); 
      thread.start(); 
      } 

      out.close(); 

     } catch (IOException ex) { 
      Logger.getLogger(ThreadGenerator.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} 

方法2:あなたは、私がPrinterWriter作成、参照、およびそれを与えることができますとして作成し、各スレッドを起動するには、手動で

public class ThreadGenerator { 

    public static void main(String[] args) { 

     File textFile = new File("c:\\threadLog.txt"); 

     try { 
      PrintWriter out = new PrintWriter(new FileWriter(textFile)); 

      ThreadCustom thread1 = new ThreadCustom("ID1", out); 
      ThreadCustom thread2 = new ThreadCustom("ID2", out); 
      ThreadCustom thread3 = new ThreadCustom("ID3", out); 
      ThreadCustom thread4 = new ThreadCustom("ID4", out); 
      ThreadCustom thread5 = new ThreadCustom("ID5", out); 
      thread1.start(); 
      thread2.start(); 
      thread3.start(); 
      thread4.start(); 
      thread5.start(); 

      out.close(); 

     } catch (IOException ex) { 
      Logger.getLogger(ThreadGenerator.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} 

これは、

public class ThreadCustom extends Thread { 

    private String threadId; 
    private PrintWriter out; 

    public ThreadCustom(String threadId, PrintWriter out){ 

     this.threadId = threadId; 
     this.out = out; 
    } 

    @Override 
    public void run(){ 

     DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
     Calendar cal = Calendar.getInstance(); 

      this.out.println("Thread ID: "+this.threadId+" Enter Time: "+cal.getTime()+"\n"); 
      for(int index = 0; index < 10000; index++){ 

       this.out.println("Thread ID: "+this.threadId+" Current Time: "+cal.getTime()+"\n"); 
      } 
      this.out.println("Thread ID: "+this.threadId+" Exit Time: "+cal.getTime()+"\n"); 
    } 
} 

だから私のThreadCustomクラスですすべてのスレッドが同じPrinterWriterオブジェクトを使用するように、ThreadCustomオブジェクトを作成するパラメータとして使用します(javaのすべてのオブジェクトは参照として渡されます)。

何を得る予定ですか?このようなもの

Thread ID: ID0 Enter Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID1 Enter Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID1 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID1 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID Exit Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID1 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012 
Thread ID: ID1 Exit Time: Fri Jan 27 00:38:54 CLST 2012 

などです。

私を助けることができますように!

あらかじめコミュニティに感謝します! ()は.txtを作成しますが、.start()の代わりに.run()を使用すると、.txtに書き込まれますが、 (ID0、ID1、ID3など)

答えて

3

出力を閉じる前に、スレッドが作業を完了するまで待つ必要があります。これを行う最も簡単な方法はjoinを使用することです。

thread1.start(); 
    thread2.start(); 
    thread3.start(); 
    thread4.start(); 
    thread5.start(); 

    thread1.join(); 
    thread2.join(); 
    thread3.join(); 
    thread4.join(); 
    thread5.join(); 

    out.close(); 
関連する問題