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