0

파일 이름과 파일에 쓸 2 차원 데이터 배열을 허용하는 스레드 생성자를 만드는 데 문제가 있습니다. 스레드 실행 메소드는 해당 2-d 배열을 파일에 쓴 다음 courses.txt 파일과 students.txt 파일에 대해이 스레드를 인스턴스화한다고 가정합니다. 다중 스레드 응용 프로그램을 사용하여이 작업을 수행하려고합니다. 2D 배열은 이미 코드에서 작성한 것처럼 2D 문자열 배열입니다. 데이터를 2D 문자열 배열에 하드 코딩했는데 파일을 쓸 스레드에 파일 이름과 배열을 전달하는 방법에 대해 약간 혼란 스럽습니다. 두 파일 중 하나를 쓰는 하나의 run() 메서드로 하나의 스레드 클래스를 작성할 수 있다는 것을 알고 있습니다. WriteFiles.java의 main()에 두 개의 스레드 인스턴스를 만들고 Student 데이터를 전달하고 다른 데이터를 전달하는 방법은 무엇입니까?다중 스레드 응용 프로그램과 함께 WriteFiles를 만드는 데 문제가 있습니다.

이 코드가 지금까지 가지고 몇 가지 지침 사랑입니다 : 마지막 students.txt 출력이이처럼 보이도록 생각됩니다

import java.util.*; 
import java.io.*; 

class WriteFiles implements Runnable 
{ 

    static final String FILE = "courses.txt"; 
    static final String FILE2 = "students.txt"; 
    BufferedWriter bw; 
    Thread thread[] = new Thread[2]; 
    private String studentList[][]; 
    private String courseList[][]; 


    public WriteFiles() 
    { 
    try 
    { 
     bw = new BufferedWriter(new FileWriter(FILE)); 
     bw = new BufferedWriter(new FileWriter(FILE2)); 
    } 
    catch(FileNotFoundException fnfe) 
    { 
     System.out.println(fnfe); 
     System.exit(1); 
    } 
    catch(IOException ioe) 
    { 
     System.out.println(ioe); 
     System.exit(2); 
    } 

    } 


    public void writeFile(String str) 
    { 

    try{ 
     bw.write(str); 
    } catch(IOException ioe){ 
     System.out.println(ioe); 
    } 
    } 



    public void run() 
    { 

     String studentList[][] = { 
      {"Python","INSY 3300","530-650 MW","1,3"}, 
      {"Networking","INSY 3303","530-650 TR","1,3"}, 
      {"DBMS","INSY 3304","900-950 MWF","1,3"}, 
      {"Analysis&Design","INSY 3305","700-820 TR","1,3"}, 
      {"Java I","INSY 4305","700-820 TR","1,3"}, 
      {"Java II","INSY 4306","530-650 TR","1,3"}, 
      {"Mobile App","INSY 4308","200-320 TR","1,3"}, 
      {"Web Development","INSY 4315","1000-1050 MWF","1,3"}, 
      {"Resource Management","INSY 4325","100-220 TR","1,3"} 
           }; 

     String courseList[][] = { 
      {"US","NONRESIDENT","123456","Jones","123 Cooper St","Arlington","Texas","76019","12345"}, 
      {"INT","ACTIVE","A-654789","Degrassey","18 Love Lane","Dallas","Texas","75052","67123"}, 
      {"INT","INACTIVE","A-543891","Franco","1201 Trail Road","Euless","Texas","74032","19814"}, 
      {"US","RESIDENT","345123","Hughes","1803 Division","Fort Worth","Texas","76034","674532"}, 
      {"US","RESIDENT","988776","Cooper","111 Marsh Lane","Bedford","Texas","76111","90906"}, 
      {"INT","INACTIVE","B-577463","Patel","2218 Border St","Arlington","Texas","76015","81832"} 
           }; 



    } 

    public void writeCourses() 
    { 
for (Student s:studentList){ 

      System.out.print(s.toString()); 
     } 
    } 

    public void writeStudents() 
    { 
     for (Course c:courseList){ 

      System.out.print(c.toString()); 
     } 

    } 


    public static void main(String arg[]) 
    { 
    WriteFiles myTread = new WriteFiles(); 
    myTread.writeCourses(); 
    myTread.writeStudents(); 
    } 
} 

을; 데이터에 따라 분할 :

미국, 비거주자, 123456, 존스 123 쿠퍼 세인트, 알링턴, 텍사스, 76019, 12345 INT, ACTIVE, A-654789; Degrassey 18 러브 레인, 달라스, 텍사스, 75052, 67123 휴즈, 1803 부서, 포트 워스, 텍사스, 76034, 674532 미국, 거주자, 988776, 술 장수, 술집, 술집, 술집, 111 마쉬 레인, 베드 포드, 텍사스, 76111, 90906 INT 비활성, B-577463; 파텔, 2218 국경 세인트, 알링턴, 텍사스, 76015, 최종 course.txt 출력과 같이 할 생각입니다 81,832

a; 데이터마다 분할 :; 3300 INSY;

파이썬 530-650 MW 1 3 네트워킹; INSY 3303; 530-650 TR 1 3 DBMS; INSY 3304; 900-950 MWF 1 3 분석 및 설계; INSY 3305; 700-820 TR; 1; 3 Java I; INSY 4305; 700-820 TR; 1; 3 Java II; INSY 4306; 530-650 TR; 1; 3 모바일 응용 프로그램; INSY 4308; 200-320 TR 1, 3 웹 개발, INSY 4315; 1,000에서 1,050 사이 MWF 1, 3 자원 관리, INSY 4325; 100-220 TR 1은,

3 내가 문제 일이 점점 없었다 다른 방법으로 성공했지만 지금은 다중 스레드 응용 프로그램을 사용하여 다른 접근 방식을 시도하고 있습니다. 여기 스레드없이 작업을 출력했다 :

import java.util.*; 
import java.io.*; 

public class WriteFiles { 
    private static Formatter output; 
    private static Scanner input; 

    public static void main(String[] args) { 

     ArrayList<Student> studentList = new ArrayList<Student>(); 
     writeTextFile1(); 

     for (Student s:studentList){ 

      System.out.print(s.toString()); 
     } 
     ArrayList<Course> courseList = new ArrayList<Course>(); 
     writeTextFile(); 

     for (Course c:courseList){ 

      System.out.print(c.toString()); 
     } 
    } 

    public static void writeTextFile(){ 
     try{ 
      output = new Formatter("courses.txt"); 
      output.format("%s;%s;%s;%d;%d%n","Python","INSY 3300","530-650 MW",1,3); 
      output.format("%s;%s;%s;%d;%d%n","Networking","INSY 3303","530-650 TR",1,3); 
      output.format("%s;%s;%s;%d;%d%n","DBMS","INSY 3304","900-950 MWF",1,3); 
      output.format("%s;%s;%s;%d;%d%n","Analysis&Design","INSY 3305","700-820 TR",1,3); 
      output.format("%s;%s;%s;%d;%d%n","Java I","INSY 4305","700-820 TR",1,3); 
      output.format("%s;%s;%s;%d;%d%n","Java II","INSY 4306","530-650 TR",1,3); 
      output.format("%s;%s;%s;%d;%d%n","Mobile App","INSY 4308","200-320 TR",1,3); 
      output.format("%s;%s;%s;%d;%d%n","Web Development","INSY 4315","1000-1050 MWF",1,3); 
      output.format("%s;%s;%s;%d;%d%n","Resource Management","INSY 4325","100-220 TR",1,3); 
      output.close(); 
     } 
     catch(IOException ioe){ 
     ioe.printStackTrace(); 
     } 
    } 

    public static void writeTextFile1(){ 

     try{ 
      output = new Formatter("students.txt"); 
      output.format("%s;%s;%s;%s;%s;%s;%s;%d;%d%n","US","NONRESIDENT","123456","Jones","123 Cooper St","Arlington","Texas",76019,12345); 
      output.format("%s;%s;%s;%s;%s;%s;%s;%d;%d%n","INT","ACTIVE","A-654789","Degrassey","18 Love Lane","Dallas","Texas",75052,67123); 
      output.format("%s;%s;%s;%s;%s;%s;%s;%d;%d%n","INT","INACTIVE","A-543891","Franco","1201 Trail Road","Euless","Texas",74032,19814); 
      output.format("%s;%s;%s;%s;%s;%s;%s;%d;%d%n","US","RESIDENT","345123","Hughes","1803 Division","Fort Worth","Texas",76034,674532); 
      output.format("%s;%s;%s;%s;%s;%s;%s;%d;%d%n","US","RESIDENT","988776","Cooper","111 Marsh Lane","Bedford","Texas",76111,90906); 
      output.format("%s;%s;%s;%s;%s;%s;%s;%d;%d%n","INT","INACTIVE","B-577463","Patel","2218 Border St","Arlington","Texas",76015,81832); 
      output.close(); 
     } 
     catch(IOException ioe){ 
     ioe.printStackTrace(); 
     } 
    } 
} 

답변

0

은 내가 파일

내가 '하지 않는 한을 기입하는 스레드에 해당 배열 및 파일 이름을 통과 할 것입니다 방법에 대한 조금 혼란 스러워요 문제를 이해하지 못한다면, 짧은 대답은 생성자에 대한 인수입니다. 내용물은 String[][]이고 출력 파일 이름은 String입니다.

public class WriteFile implements Runnable { 
    private final String[][] contentLines; 
    private final String outputFilename; 
    public WriteFile(String[][] contentLines, String outputFilename) { 
     this.contentLines = contentLines; 
     this.outputFilename = outputFilename; 
    } 
    public void run() { 
     // write the content to the file-name 
     BufferedWriter bw = new BufferedWriter(new FileWriter(outputFilename)); 
     try { 
     for (String[] contentLine : contentLines) { 
      ... 
     } 
     } finally { 
     bw.close(); 
     } 
    } 
} 
당신은 다음과 같이 말함으로써이 부를 것이다

:이 실행 가능한에 Student 또는 Course 객체를 전달하는 경우

Thread studentThread = new Thread(new WriteFile(studentList, "students.txt")); 
studentThread.start(); 
Thread courseThread = new Thread(new WriteFile(courseList, "courses.txt")); 
courseThread.start(); 
// now wait for the threads to finish writing 
studentThread.join(); 
courseThread.join(); 

을 다음의 각 유형을 처리하기 위해 다른 실행 가능한을 만들어야합니다 데이터가 쓰여지고 있습니다.

// student file writer runnable 
Thread studentThread = new Thread(new WriteStudentFile(studentList, "students.txt")); 
// course file writer runnable 
Thread courseThread = new Thread(new WriteCourseFile(courseList, "courses.txt")); 
+0

이 정보는 사람에게 도움이됩니다. 하지만 이제는 Formatter를 사용해야하고 BufferedWriter를 사용할 수 없다는 말을 듣고 있습니다. try 메서드에서 student 클래스의 실제 String 배열을 올바르게 삽입하고 있습니까? 코스를위한 다른 try 메소드? ..... 그리고 내가 스레드를 시작하는 주요 thats에?. – Donovan

+0

문자열 배열은 학생 _ 또는 _ 과목을위한 것일 수 있습니다. 코드 재사용이 중요한 부분입니까? 다시 말하지만, 코드를 다르게 처리해야한다면 코드를 공유 할 필요가 없습니다. – Gray

+0

또한 @Fred, 필자는'Formatter' 코드를 올바르게 작성할 수 있다고 생각합니까? – Gray

0

나는 방금 arraylist를 잘못 알아 냈습니다. 저는 그것을 하나의 단일 라인으로 다룰 것입니다. 그러나 여전히 GUI 프로그램의 2D bc를 분할하려고합니다. 조건

String studentList[][] = { 
     {"Python;INSY 3300;530-650 MW;1,3"}, 
     {"Networking;INSY 3303;530-650 TR;1,3"}, 
     {"DBMS;INSY 3304;900-950 MWF;1,3"}, 
     {"Analysis&Design;INSY 3305;700-820 TR;1,3"}, 
     {"Java I;INSY 4305","700-820 TR","1,3"}, 
     {"Java II","INSY 4306;530-650 TR;1,3"}, 
     {"Mobile App;INSY 4308;200-320 TR;1,3"}, 
     {"Web Development;INSY 4315;1000-1050 MWF;1,3"}, 
     {"Resource Management;INSY 4325;100-220 TR;1,3"} 
          }; 

    String courseList[][] = { 
     {"US;NONRESIDENT;23456;Jones;123 Cooper St;Arlington;Texas;76019;12345"}, 
     {"INT;ACTIVE;A-654789;Degrassey;18 Love Lane;Dallas;Texas;75052;67123"}, 
     {"INT;INACTIVE;A-543891;Franco;1201 Trail Road;Euless;Texas;74032;19814"}, 
     {"US;RESIDENT;345123;Hughes;1803 Division;Fort Worth;Texas;76034;674532"}, 
     {"US;RESIDENT;988776;Cooper;111 Marsh Lane;Bedford;Texas;76111;90906"}, 
     {"INT;INACTIVE;B-577463;Patel;2218 Border St;Arlington;Texas;76015;81832"} 
          }; 

나는 아직도 조금 혼란 스럽다. 주 스레드 배열을 쓰고 있습니까?

0

해결했습니다! 참조하려는 사람에게 비슷한 문제가 발생하면 코드를 공유합니다.

//Donovan 
package hw2; 
//Importing Java imports that are required for the program to execute properly 
import java.util.concurrent.Executors; 
import java.util.concurrent.ExecutorService; 
import java.util.*; 
import java.io.*; 
//Creating my public & private class for WriteFiles that uses Runnable, including Formatter 
public class WriteFiles implements Runnable{ 
private String threadDonovan; 
private String[][] arrayDonovan; 
Formatter output; 
//Creating a WriteFiles which will accept a thread as a String and a 2D ArrayList for later Execution 
public WriteFiles(String str, String arrays[][]) 
{ 
//Create a string an array for later use in the run() 
threadDonovan = str; 
arrayDonovan = arrays; 
} 
//Time to run a try and catch methods 
public void run() 
    { 
     //First have to try a few things 
     try 
      { 
       //create a Formatter from my Thread 
       output = new Formatter(threadDonovan); 
       //Running 2 for loops to output the correct information into the .txt files 
       for (int i = 0; i < arrayDonovan.length; i++) 
        { 
         for (int j = 0; j < arrayDonovan[i].length; j++) 
          { 
           //Proper Formatting is Required so the .txt files 
           //are written properly so they're the same way as HW1 
           //and so the GUI doesn't run into any problems 
           output.format("%s%n",arrayDonovan[i][j]); 
          } 
        } 
       //Once the Data is written, have to close the Formatter     
       output.close();   
      } 
     //Now have to catch a few errors and print them to debug if needed 
     catch(IOException ioe) 
      { 
       ioe.printStackTrace(); 
       System.out.println(ioe); 
       System.exit(2); 
      } 
} 
//creating the main which will have the 2D ArrayList and the Executor Service 
public static void main(String[] args) throws InterruptedException 
    { 
    //create my 2D ArrayList for Students 
    String studentList[][] = { 
       {"US;NONRESIDENT;23456;Jones;123 Cooper St;Arlington;Texas;76019;12345"}, 
       {"INT;ACTIVE;A-654789;Degrassey;18 Love Lane;Dallas;Texas;75052;67123"}, 
       {"INT;INACTIVE;A-543891;Franco;1201 Trail Road;Euless;Texas;74032;19814"}, 
       {"US;RESIDENT;345123;Hughes;1803 Division;Fort Worth;Texas;76034;674532"}, 
       {"US;RESIDENT;988776;Cooper;111 Marsh Lane;Bedford;Texas;76111;90906"}, 
       {"INT;INACTIVE;B-577463;Patel;2218 Border St;Arlington;Texas;76015;81832"} 
           }; 
    //create my 2D ArrayList for Courses 
    String courseList[][] = { 
       {"Python;INSY 3300;530-650 MW;1;3"}, 
       {"Networking;INSY 3303;530-650 TR;1;3"}, 
       {"DBMS;INSY 3304;900-950 MWF;1;3"}, 
       {"Analysis&Design;INSY 3305;700-820 TR;1;3"}, 
       {"Java I;INSY 4305;700-820 TR;1;3"}, 
       {"Java II;INSY 4306;530-650 TR;1;3"}, 
       {"Mobile App;INSY 4308;200-320 TR;1;3"}, 
       {"Web Development;INSY 4315;1000-1050 MWF;1;3"}, 
       {"Resource Management;INSY 4325;100-220 TR;1;3"} 
          }; 
    //What will be created once ExecutorService Starts for Students 
    WriteFiles studentFile = new WriteFiles("students.txt",studentList); 
    //What will be created once ExecutorService Starts for Courses 
    WriteFiles courseFile = new WriteFiles("courses.txt",courseList); 
    //Begin the Executor Service 
    ExecutorService executorService = Executors.newCachedThreadPool(); 
    //start the first Task/Thread to create students.txt from the studentList 2D ArrayLIst   
    executorService.execute(studentFile); 
    //start the first Task/Thread to create courses.txt from the courseList 2D ArrayLIst 
    executorService.execute(courseFile); //start task 2 
    //End the Executor Service 
    executorService.shutdown(); 
    } 
}