2012-01-27 6 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 

또는 이와 비슷한 것입니다.

희망을 보내주세요.

미리 감사드립니다. 012.START()를 사용하면 .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();