Java 使用多线程应用程序创建写文件时出现问题

Java 使用多线程应用程序创建写文件时出现问题,java,multithreading,multidimensional-array,bufferedwriter,thread-synchronization,Java,Multithreading,Multidimensional Array,Bufferedwriter,Thread Synchronization,我在尝试创建一个线程构造函数时遇到了一些问题,该构造函数将接受一个文件名和一个要写入文件的二维数据数组。假设线程运行方法将该二维数组写入文件,然后为courses.txt文件和students.txt文件实例化该线程。我正试图通过使用多线程应用程序来实现这一点。2D数组将是2D字符串数组,正如我在代码中已经创建的那样。我已经将数据硬编码到2D字符串数组中,但对于如何将该数组和文件名传递给编写该文件的线程,我有点困惑。我知道我可以用一个run()方法编写一个线程类,该方法可以编写任意一个文件。如何

我在尝试创建一个线程构造函数时遇到了一些问题,该构造函数将接受一个文件名和一个要写入文件的二维数据数组。假设线程运行方法将该二维数组写入文件,然后为courses.txt文件和students.txt文件实例化该线程。我正试图通过使用多线程应用程序来实现这一点。2D数组将是2D字符串数组,正如我在代码中已经创建的那样。我已经将数据硬编码到2D字符串数组中,但对于如何将该数组和文件名传递给编写该文件的线程,我有点困惑。我知道我可以用一个run()方法编写一个线程类,该方法可以编写任意一个文件。如何在WriteFiles.java的main()中创建该线程的两个实例,然后将一个学生数据传递给另一个课程数据

这是迄今为止我所掌握的代码,我希望得到一些指导:

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();
  }
}
最后的students.txt输出应该是这样的,带有;按数据拆分:

美国;非居民;123456;琼斯;库珀街123号;阿灵顿;德克萨斯州;76019;12345 INT;活跃的;A-654789;德格拉西;爱里十八号;;达拉斯;德克萨斯州;75052;67123 INT;不活跃的A-543891;佛朗哥;小径1201号;颂词;德克萨斯州;74032;19814 美国;居民;345123;休斯;1803司;沃思堡;德克萨斯州;76034;674532 美国;居民;988776;库珀;马师里111号;;贝德福德;德克萨斯州;76111;90906 INT;不活跃的B-577463;帕特尔;边境街2218号;阿灵顿;德克萨斯州;76015;81832

最后的course.txt输出应该是这样的,带有一个;按数据拆分:

蟒蛇;INSY 3300;530-650兆瓦;1.3. 网络;INSY 3303;530-650 TR;1.3. 数据库管理系统;INSY 3304;900-950兆瓦;1.3. 分析与设计;INSY 3305;700-820 TR;1.3. 爪哇岛;INSY 4305;700-820 TR;1.3. 爪哇II;INSY 4306;530-650 TR;1.3. 移动应用程序;INSY 4308;200-320 TR;1.3. 网络开发;INSY 4315;1000-1050兆瓦;1.3. 资源管理;INSY 4325;100-220 TR;1.三,

我用另一种方法实现这一点并没有问题,而且是成功的,但我现在正在尝试使用多线程应用程序的另一种方法。这是一个没有线程的工作输出:

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();
        }
    }
}
import java.util.*;
导入java.io.*;
公共类写文件{
专用静态格式化程序输出;
专用静态扫描仪输入;
公共静态void main(字符串[]args){
ArrayList studentList=新建ArrayList();
writeTextFile1();
对于(学生s:学生名单){
System.out.print(s.toString());
}
ArrayList courseList=新的ArrayList();
writeTextFile();
对于(课程c:课程列表){
System.out.print(c.toString());
}
}
公共静态void writeTextFile(){
试一试{
输出=新格式化程序(“courses.txt”);
输出格式(“%s;%s;%s;%d;%d%n”,“Python”,“INSY 3300”,“530-650 MW”,1,3);
输出格式(“%s;%s;%s;%d;%d%n”,“网络”,“INSY 3303”,“530-650 TR”,1,3);
输出格式(“%s;%s;%s;%d;%d%n”,“DBMS”,“INSY 3304”,“900-950 MWF”,1,3);
输出格式(“%s;%s;%s;%d;%d%n”,“分析与设计”,“INSY 3305”,“700-820 TR”,1,3);
格式(“%s;%s;%s;%d;%d%n”、“Java I”、“INSY 4305”、“700-820 TR”、1,3);
格式(“%s;%s;%s;%d;%d%n”,“Java II”,“INSY 4306”,“530-650 TR”,1,3);
输出.格式(“%s;%s;%s;%d;%d%n”,“移动应用程序”,“INSY 4308”,“200-320 TR”,1,3);
输出格式(“%s;%s;%s;%d;%d%n”,“Web开发”,“INSY 4315”,“1000-1050 MWF”,1,3);
输出格式(“%s;%s;%s;%d;%d%n”,“资源管理”,“INSY 4325”,“100-220 TR”,1,3);
output.close();
}
捕获(ioe异常ioe){
ioe.printStackTrace();
}
}
公共静态无效writeTextFile1(){
试一试{
output=newformatter(“student.txt”);
输出.格式(“%s;%s;%s;%s;%s;%s;%s;%d;%d%n”,“美国”,“非居民”,“123456”,“琼斯”,“123库珀街”,“阿灵顿”,“德克萨斯州”,7601912345);
输出.格式(“%s;%s;%s;%s;%s;%s;%s;%d;%d%n”,“INT”,“ACTIVE”,“A-654789”,“Degrassey”,“18 Love Lane”,“Dallas”,“Texas”,7505267123);
输出.格式(“%s;%s;%s;%s;%s;%s;%s;%d;%d%n”,“INT”,“INACTIVE”,“A-543891”,“Franco”,“1201 Trail Road”,“Euless”,“Texas”,“7403219814”);
输出.格式(“%s;%s;%s;%s;%s;%s;%s;%s;%d;%d%n”、“美国”、“居民”、“345123”、“休斯”、“1803师”、“沃思堡”、“德克萨斯州”、“76034674532”);
输出.格式(“%s;%s;%s;%s;%s;%s;%s;%d;%d%n”、“美国”、“居民”、“988776”、“库珀”、“111马什巷”、“贝德福德”、“德克萨斯州”、“7611190906”);
输出.格式(“%s;%s;%s;%s;%s;%s;%s;%d;%d%n”、“INT”、“非活动”、“B-577463”、“Patel”、“2218 Border St”、“阿灵顿”、“德克萨斯州”7601581832);
output.close();
}
捕获(ioe异常ioe){
ioe.printStackTrace();
}
}
}
对于如何将该数组和文件名传递给编写该文件的线程,我有点困惑

除非我不理解这个问题,否则简短的答案是使用构造函数的参数。您将为内容传入一个
字符串[][]
,并将一个
字符串
作为输出文件名

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();
      }
   }
}
然后你可以这样说:

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();
如果要将
学生
课程
对象传递到此runnable中,则需要创建不同的runnable来处理所写入的每种类型的数据

// 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"));

我刚发现我的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"}
                             };

我还是有点困惑。我在主线程中写入线程数组吗?

解决了它!对于那些想要引用的人,如果他们碰巧遇到类似的问题,我将分享以下代码:

//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();
    }
}
//多诺万
包装hw2;
//导入程序正确执行所需的Java导入
导入java.util.concurrent.Executors;
导入java.util.concurrent.ExecutorService;
导入java.util.*;
导入java.io.*;
//为使用Run的WriteFile创建我的公共和私有类