Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从线程返回多个值以及如何处理此值_Java_Multithreading_Return Value - Fatal编程技术网

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个进程,并向主线程返回一个字节[]。然后主程序将处理这个字节数组 我可以使用线程,但返回值有问题。线程如何将每行的字节[]返回到主

我不熟悉Java窗口应用程序。我需要制作一个运行脚本的Java工具。脚本像
-.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中打印它的代码;