带线程池的Java线程队列
我制作了一个程序,它使用一个线程将文件中的数据读取到一个链表中,我们称之为LL1。由此,我创建了一个线程池,为每个线程分配一个处理任务,该任务从LL1读取数据,并将其计算结果输出到一个新的链表。 从这里,我需要将每个线程的新链表输出到一个文件中。我试图以顺序块的形式输出每个链表,这样线程就不会混合数据,所以我使用了一个同步点,如下所示:带线程池的Java线程队列,java,multithreading,input,linked-list,output,Java,Multithreading,Input,Linked List,Output,我制作了一个程序,它使用一个线程将文件中的数据读取到一个链表中,我们称之为LL1。由此,我创建了一个线程池,为每个线程分配一个处理任务,该任务从LL1读取数据,并将其计算结果输出到一个新的链表。 从这里,我需要将每个线程的新链表输出到一个文件中。我试图以顺序块的形式输出每个链表,这样线程就不会混合数据,所以我使用了一个同步点,如下所示: public synchronized void appendContents(List<Vector2> output1) { try {
public synchronized void appendContents(List<Vector2> output1) {
try {
sFileName = outFilePath + "\\file" +fileCount+ ".cntr";
File oFile = new File(sFileName);
if (!oFile.exists()) {
oFile.createNewFile();
}
if (oFile.canWrite()) {
//BufferedWriter oWriter = new BufferedWriter(new FileWriter(sFileName, true));
FileWriter wstream = new FileWriter(oFile, true);
BufferedWriter outWriter = new BufferedWriter(wstream);
for(int i = 0; i < output1.size(); i++)
{
//replace the space marker values with a newline
if(output1.get(i).y == -200.0){
outWriter.newLine();
}else{
outWriter.write(String.valueOf(output1.get(i).x) + " " + String.valueOf(output1.get(i).y) + " " + String.valueOf(interval));
outWriter.newLine();
}
}
outWriter.close();
}
}
catch (IOException oException) {
throw new IllegalArgumentException("Error appending/File cannot be written: \n" + sFileName);
}
如果有人能给我一个正确的方向,我将不胜感激。
谢谢
杰克同步的目的是在共享资源上同步,以便一次只有一个
线程
可以访问关键部分。我假设您正在生成三个Thread
实例,每个实例都在自己的对象上调用appendContents
synchronized
方法在此
上隐式同步,但由于所有三个线程
都在不同的对象上同步,即不同的此
,没有任何东西阻止它们。同步的的目的是在共享资源上同步,以便只有一个线程在同一时间访问关键部分。我假设您正在生成三个Thread
实例,每个实例都在自己的对象上调用appendContents
synchronized
方法隐式地在this
上同步,但由于所有三个线程都在不同的对象上同步,即,不同的this
,因此没有任何东西阻止它们。据我所知,您每次都为每个列表元素运行新任务吗
然后您可以编写可调用任务->将结果保存到功能中。将功能放入列表vs结果(resultFeatureFromList)。最后做一些像这样的事情:
我使用番石榴库中的函数
Iterables.transform(resultList<Feature>,new Function(){
public resultComputition apply(Feature resultFeatureFromList){
return resultFeatureFromList.get();
}
});
Iterables.transform(结果列表,新函数(){
公共结果计算应用(要素结果要素列表){
返回resultFeatureFromList.get();
}
});
总之,您将以正确的顺序运行所有任务。在拉取所有数据之后,只需等待结果。据我所知,您每次都为每个列表元素运行新任务吗
然后您可以编写可调用任务->将结果保存到功能中。将功能放入列表vs结果(resultFeatureFromList)。最后做一些像这样的事情:
我使用番石榴库中的函数
Iterables.transform(resultList<Feature>,new Function(){
public resultComputition apply(Feature resultFeatureFromList){
return resultFeatureFromList.get();
}
});
Iterables.transform(结果列表,新函数(){
公共结果计算应用(要素结果要素列表){
返回resultFeatureFromList.get();
}
});
总之,您将以正确的顺序运行所有任务。在提取完所有内容后,只需等待结果。从中详细说明,您可以按如下方式构建应用程序:
public synchronized void appendContents(List<Vector2> output1) {
try {
sFileName = outFilePath + "\\file" +fileCount+ ".cntr";
File oFile = new File(sFileName);
if (!oFile.exists()) {
oFile.createNewFile();
}
if (oFile.canWrite()) {
//BufferedWriter oWriter = new BufferedWriter(new FileWriter(sFileName, true));
FileWriter wstream = new FileWriter(oFile, true);
BufferedWriter outWriter = new BufferedWriter(wstream);
for(int i = 0; i < output1.size(); i++)
{
//replace the space marker values with a newline
if(output1.get(i).y == -200.0){
outWriter.newLine();
}else{
outWriter.write(String.valueOf(output1.get(i).x) + " " + String.valueOf(output1.get(i).y) + " " + String.valueOf(interval));
outWriter.newLine();
}
}
outWriter.close();
}
}
catch (IOException oException) {
throw new IllegalArgumentException("Error appending/File cannot be written: \n" + sFileName);
}
- 让线程读取文件内容李>
- 对于文件中的每个项目,向线程池提交一个
Callable
任务李>
- 将返回的
Future
存储在一个列表或列表中-您可以定义所需的粒度李>
- 在同一线程中打开输出文件,并遍历结果列表进行写入
例如:
void readAndOutput(String inputFilePath, String outputFilePath) {
List<List<Future<Result>>> results = readAndSpawnTask(inputFilePath);
PrintWriter out = new PrintWriter(new File(outputFilePath));
for (List<Future<Result>> block : results) {
for (Future<Result> r : block) {
out.println(r.get().toString());
}
}
out.flush();
out.close();
}
List<List<Future<Result>>> readAndSpawnTask(String path) {
List<List<Future<Result>>> results = new ArrayList<>(numOfBlocks);
BufferedReader in = new BufferedReader(new FileReader(new File(path)));
for (int i = 0; i < numOfBlocks; ++i) {
results.add(new LinkedList<Future<Result>>());
}
for (String line = in.readLine(); line != null; line = in.readLine()) {
int respectiveBlock;
Callable<Result> task;
// Process line and convert it into a task of your own.
// Determine in which block the result goes into.
Future<Result> r = threadPool.submit(task);
results.get(respectiveBlock).add(r);
}
in.close();
return results;
}
void readAndOutput(字符串inputFilePath,字符串outputFilePath){
列表结果=readAndSpawnTask(inputFilePath);
PrintWriter out=新的PrintWriter(新文件(outputFilePath));
用于(列表块:结果){
用于(未来r:区块){
out.println(r.get().toString());
}
}
out.flush();
out.close();
}
列表readAndSpawnTask(字符串路径){
列表结果=新的ArrayList(numOfBlocks);
BufferedReader in=新的BufferedReader(新文件读取器(新文件(路径));
对于(int i=0;i
如果您想要和/或需要并发性,可以在单个线程中访问文件。使用Future
列表,您可以保证以正确的顺序写入结果,并且您的主线程将阻塞,直到所需的结果准备就绪
当然,您仍然需要考虑上述代码中可能引发的异常。详细说明,您可以按照以下方式构建应用程序:
public synchronized void appendContents(List<Vector2> output1) {
try {
sFileName = outFilePath + "\\file" +fileCount+ ".cntr";
File oFile = new File(sFileName);
if (!oFile.exists()) {
oFile.createNewFile();
}
if (oFile.canWrite()) {
//BufferedWriter oWriter = new BufferedWriter(new FileWriter(sFileName, true));
FileWriter wstream = new FileWriter(oFile, true);
BufferedWriter outWriter = new BufferedWriter(wstream);
for(int i = 0; i < output1.size(); i++)
{
//replace the space marker values with a newline
if(output1.get(i).y == -200.0){
outWriter.newLine();
}else{
outWriter.write(String.valueOf(output1.get(i).x) + " " + String.valueOf(output1.get(i).y) + " " + String.valueOf(interval));
outWriter.newLine();
}
}
outWriter.close();
}
}
catch (IOException oException) {
throw new IllegalArgumentException("Error appending/File cannot be written: \n" + sFileName);
}
- 让线程读取文件内容李>
- 对于文件中的每个项目,向线程池提交一个
Callable
任务李>
- 将返回的
Future
存储在一个列表或列表中-您可以定义所需的粒度李>
- 在同一线程中打开输出文件,并遍历结果列表进行写入
例如:
void readAndOutput(String inputFilePath, String outputFilePath) {
List<List<Future<Result>>> results = readAndSpawnTask(inputFilePath);
PrintWriter out = new PrintWriter(new File(outputFilePath));
for (List<Future<Result>> block : results) {
for (Future<Result> r : block) {
out.println(r.get().toString());
}
}
out.flush();
out.close();
}
List<List<Future<Result>>> readAndSpawnTask(String path) {
List<List<Future<Result>>> results = new ArrayList<>(numOfBlocks);
BufferedReader in = new BufferedReader(new FileReader(new File(path)));
for (int i = 0; i < numOfBlocks; ++i) {
results.add(new LinkedList<Future<Result>>());
}
for (String line = in.readLine(); line != null; line = in.readLine()) {
int respectiveBlock;
Callable<Result> task;
// Process line and convert it into a task of your own.
// Determine in which block the result goes into.
Future<Result> r = threadPool.submit(task);
results.get(respectiveBlock).add(r);
}
in.close();
return results;
}
void readAndOutput(字符串inputFilePath,字符串outputFilePath){
列表结果=readAndSpawnTask(inputFilePath);
PrintWriter out=新的PrintWriter(新文件(outputFilePath));
用于(列表块:结果){
用于(未来r:区块){
out.println(r.get().toString());
}
}
out.flush();
out.close();
}
列表readAndSpawnTask(字符串路径){
列表结果=新的ArrayList(numOfBlocks);
BufferedReader in=新的BufferedReader(新文件读取器(新文件(路径));
对于(int i=0;i