Java 如何从线程返回多个值以及如何处理此值
我不熟悉Java窗口应用程序。我需要制作一个运行脚本的Java工具。脚本像Java 如何从线程返回多个值以及如何处理此值,java,multithreading,return-value,Java,Multithreading,Return Value,我不熟悉Java窗口应用程序。我需要制作一个运行脚本的Java工具。脚本像-.txt文件一样运行,并给出以下输出: line 1 line 2 line 3 and so on.... 我需要Java程序执行以下步骤: 检查每行语法是否正确 如果行是正确的,则用此行生成一个字节[] 进程字节[]数组 我想在这里使用线程conpt。我希望子线程处理1和2个进程,并向主线程返回一个字节[]。然后主程序将处理这个字节数组 我可以使用线程,但返回值有问题。线程如何将每行的字节[]返回到主
-.txt文件一样运行,并给出以下输出:
line 1
line 2
line 3
and so on....
我需要Java程序执行以下步骤:
检查每行语法是否正确
如果行是正确的,则用此行生成一个字节[]
进程字节[]数组
我想在这里使用线程conpt。我希望子线程处理1和2个进程,并向主线程返回一个字节[]
。然后主程序将处理这个字节数组
我可以使用线程,但返回值有问题。线程如何将每行的字节[]
返回到主线程?主线程如何以同步方式接收此字节[]
数组?从线程返回值的最简单方法是使用ExecutorService
和Future
类。您可以将任意多个作业提交到线程池中。还可以为每个作业添加更多线程或分叉一个线程。请参阅Executors
中的其他方法
例如:
// create a thread pool
ExecutorService threadPool = Executors.newFixedThreadPool(2);
// submit a job to the thread pool maybe with the script name to run
Future<byte[]> future1 = threadPool.submit(new MyCallable("scriptFile1.txt"));
// waits for the task to finish, get the result from the job, this may throw
byte[] result = future1.get();
public class MyCallable implements Callable<byte[]> {
private String fileName;
public MyCallable(String fileName) {
this.fileName = fileName;
}
public byte[] call() {
// run the script
// process the results into the byte array
return someByteArray;
}
});
//创建线程池
ExecutorService线程池=Executors.newFixedThreadPool(2);
//将作业提交到线程池,可能使用要运行的脚本名称
Future future1=threadPool.submit(新的MyCallable(“scriptFile1.txt”);
//等待任务完成,从作业中获取结果,这可能会引发
字节[]结果=future1.get();
公共类MyCallable实现了Callable{
私有字符串文件名;
公共MyCallable(字符串文件名){
this.fileName=文件名;
}
公共字节[]调用(){
//运行脚本
//将结果处理到字节数组中
返回某处;
}
});
是否只有一个文本文件?是的,只有一个文本文件没有行,每行代表一个命令,如果它写得好,我需要提取它。然后通过多线程访问一个文件将不是一个好的多线程解决方案。我刚刚编辑了您的问题。希望我没有改变意思。以前它几乎不可读。请注意,在现代计算机上解析命令行根本不需要时间。所以在实践中,没有人会创建这样一个方案,至少不是为了解析。谢谢你的时间。。。看起来很难。。。。我要试试这个。我希望…….在普通线程中,我创建了一个thread类的对象,通过单击按钮或从任何地方调用obj.start()。你的意思是说我应该使用公共类MyCallable实现Callable而不是公共类mythread扩展线程{},对吗?还有一件事——若我的文件包含10行,意味着我需要一个接一个地返回10字节[],但似乎只返回一次。给我一些提示,我如何一行一行地处理并为每一行返回字节[],我想实现这样的功能——只要线程返回一个值,就会立即执行某行代码并使用返回值是ExecutorService
为您处理线程。您只需要一个可调用的
。您只能从未来
返回一个值。它可以是一个列表
。如果您希望线程在处理过程中进行通信,那么处理线程可以将字节[]
添加到阻塞队列
,而不是未来的
。这确实是一个真实的概念,我是一个初学者,我需要花时间在这方面,但不幸的是,我需要完成我的作业,所以您可以为我编码。。。。一个简单的场景是-file.txt包含5行,每行包含一个名称,我需要在控制台中打印它,我想将文件路径传递给线程,线程逐行读取(line=readline()!=null)并发送到主线程,然后主线程在控制台中打印它,我需要的是“同步”-逐行发送,通过System.out.println(行)在cosole中打印它的代码;