Java 使用线程运行方法
我需要使用thread来运行Java 使用线程运行方法,java,multithreading,design-patterns,Java,Multithreading,Design Patterns,我需要使用thread来运行SlowFileStringifier.display()方法。我已经创建了一个代理类来运行public void display(PrintWriter out)方法,该方法存在于SlowFileStringifier类中 程序读取数据文件夹中的文件并显示输出 代理display(PrintWriter out)应该立即输出一些文本,然后它应该启动一个线程来运行SlowFileStringifier.display()方法 下面是我想要的输出: Reading da
SlowFileStringifier.display()
方法。我已经创建了一个代理类来运行public void display(PrintWriter out)
方法,该方法存在于SlowFileStringifier
类中
程序读取数据文件夹中的文件并显示输出
代理display(PrintWriter out)
应该立即输出一些文本,然后它应该启动一个线程来运行SlowFileStringifier.display()
方法
下面是我想要的输出:
Reading data\anaisnin.txt
Reading data\cree.txt
Reading data\maewest.txt
Reading data\marktwain.txt
Reading data\rumi.txt
"Whenever you find yourself on the side of the majority, it is time to pause and reflect."
- Mark Twain
"You only live once, but if you do it right, once is enough."- Mae West
"If you are irritated by every rub, how will your mirror be polished?"
- Jalaluddin Mevlana Rumi
"There came a time when the risk to remain tight in the bud was more painful than the risk it took to blossom."
- Anais Nin
以下是我的课程:
import java.io.PrintWriter;
public class FileStringifierProxy implements FileStringifier{
private final String fileName;
public FileStringifierProxy(String filename) {
this.fileName = filename;
}
@Override
public void display(PrintWriter out) {
System.out.println("Reading "+fileName);
SlowFileStringifier slowfilestringifier = new SlowFileStringifier(fileName);
slowfilestringifier.display(out);
}
@Override
public String stringify() {
// TODO Auto-generated method stub
return null;
}
}
import java.io.*;
import java.util.ArrayList;
/**
* Simple file reader that turns a file into a string
*/
public class SlowFileStringifier implements FileStringifier {
/**
* Create a file stringifier with a file name
*
* @param filename
* file name of file
*/
public SlowFileStringifier(String filename) {
this.fileName = filename;
}
/**
* Writes out the file contents to the print writer
*
* @param out
* the output print writer
*/
public void display(PrintWriter out) {
out.println(this.stringify());
out.flush();
}
/**
* Returns a string with all the files contents
*/
public String stringify() {
FileReader f;
try {
f = new FileReader(this.fileName);
BufferedReader bf = new BufferedReader(f);
ArrayList<String> lines = new ArrayList<String>();
String line = null;
while ((line = bf.readLine()) != null) {
Thread.sleep(2000);
lines.add(line);
}
bf.close();
return String.join("\n", lines);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.err.println("File " + this.fileName + " was not found.");
} catch (IOException e) {
e.printStackTrace();
System.err.println("Problem reading file " + this.fileName + ".");
} catch (InterruptedException e) {
e.printStackTrace();
System.err.println("File reading interrupted: " + this.fileName);
}
return "";
}
private final String fileName;
}
public class ShowFileContents {
/**
* Accepts a file directory and then prints out the contents of all the
* files in that directory
*
* @param args
* single arg with directory path
*/
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("Usage: java ShowFileContents <directory>");
}
String dirname = args[0];
File dir = new File(dirname);
if (!dir.exists()) {
System.err.println(dirname + " does not exist");
return;
}
if (!dir.isDirectory()) {
System.err.println(dirname + " is not a directory");
return;
}
PrintWriter outWriter = new PrintWriter(System.out);
for (File file : dir.listFiles()) {
if (file.isDirectory())
continue;
FileStringifier fd = new FileStringifierProxy(file.getPath());
fd.display(outWriter);
}
}
}
您可以使用CountDownLatch(建议的)和CyclicBarrier。两者都提供了线程同步的方式。
在您的情况下,您希望线程等待完成写入名称,然后继续内容
为了解决您的具体问题,这里是您可能需要使用的代码
你的主要方法是:
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("Usage: java ShowFileContents <directory>");
}
String dirname = args[0];
File dir = new File(dirname);
if (!dir.exists()) {
System.err.println(dirname + " does not exist");
return;
}
if (!dir.isDirectory()) {
System.err.println(dirname + " is not a directory");
return;
}
File[] files = dir.listFiles();
int noOfFilesToProcess = 0;
for (final File file : files) {
if (!file.isDirectory()) {
noOfFilesToProcess++;
}
}
final CountDownLatch startSignal = new CountDownLatch(1);
final CountDownLatch doneSignal = new CountDownLatch(noOfFilesToProcess);
final PrintWriter outWriter = new PrintWriter(System.out);
for (final File file : files) {
if (file.isDirectory())
continue;
Thread thread = new Thread() {
public void run() {
FileStringifier fd = new FileStringifierProxy(
file.getPath(), startSignal, doneSignal);
fd.display(outWriter);
}
};
thread.start();
}
// Do something here
startSignal.countDown(); // let all threads proceed
// Do something here while other threads are processing
try {
doneSignal.await(); // wait for all to finish
} catch (InterruptedException e) {
e.printStackTrace();
}
// Do something after all thread finishes
}
您可以使用CountDownLatch(建议的)和CyclicBarrier。两者都提供了线程同步的方式。
在您的情况下,您希望线程等待完成写入名称,然后继续内容
为了解决您的具体问题,这里是您可能需要使用的代码
你的主要方法是:
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("Usage: java ShowFileContents <directory>");
}
String dirname = args[0];
File dir = new File(dirname);
if (!dir.exists()) {
System.err.println(dirname + " does not exist");
return;
}
if (!dir.isDirectory()) {
System.err.println(dirname + " is not a directory");
return;
}
File[] files = dir.listFiles();
int noOfFilesToProcess = 0;
for (final File file : files) {
if (!file.isDirectory()) {
noOfFilesToProcess++;
}
}
final CountDownLatch startSignal = new CountDownLatch(1);
final CountDownLatch doneSignal = new CountDownLatch(noOfFilesToProcess);
final PrintWriter outWriter = new PrintWriter(System.out);
for (final File file : files) {
if (file.isDirectory())
continue;
Thread thread = new Thread() {
public void run() {
FileStringifier fd = new FileStringifierProxy(
file.getPath(), startSignal, doneSignal);
fd.display(outWriter);
}
};
thread.start();
}
// Do something here
startSignal.countDown(); // let all threads proceed
// Do something here while other threads are processing
try {
doneSignal.await(); // wait for all to finish
} catch (InterruptedException e) {
e.printStackTrace();
}
// Do something after all thread finishes
}
而现在发生了什么呢?考虑使用一个CurtDutLabCH,你似乎没有使用新的线程来运行你的文件的内容。然后发生了什么?考虑使用一个NouttLutCLCH,你似乎没有使用新的线程来运行你的文件的内容。
class FileStringifierProxy implements FileStringifier {
private final String fileName;
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
public FileStringifierProxy(String filename, CountDownLatch startSignal,
CountDownLatch doneSignal) {
this.fileName = filename;
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
public void display(final PrintWriter out) {
System.out.println("Reading " + fileName);
final SlowFileStringifier slowfilestringifier = new
SlowFileStringifier(
fileName);
try {
startSignal.await(); // Wait for start signal from main thread
} catch (InterruptedException e) {
e.printStackTrace();
}
slowfilestringifier.display(out); // Display file content
doneSignal.countDown(); // Send done signal to main thread
}
public String stringify() {
// TODO Auto-generated method stub
return null;
}
}