java中线程的返回值

java中线程的返回值,java,multithreading,Java,Multithreading,问题是这样的。我需要多次处理一个大文件。所以我认为线程将帮助我增加时间。到目前为止,我已经做到了这一点 实现Runnable的类: public class ProcessFile() implements Runnable { private int max; private int i; private int j; public ProcessFile(int i, int j) { this.i = i;

问题是这样的。我需要多次处理一个大文件。所以我认为线程将帮助我增加时间。到目前为止,我已经做到了这一点

实现
Runnable
的类:

public class ProcessFile() implements Runnable {
       private int max;
       private int i;
       private int j;

       public ProcessFile(int i, int j) {
             this.i = i;
             this.j = j;
       }
       public void run() {
       //Perform operations on the file
       }
       public int getMaximum() {
             return this.max;
       }
 }
我从中调用线程的类:

public calss Start {
     public static void main(String[] args) {
        for (int i=0;i<=10;i++) {
             for (int j=0;j<=5;j++) {
                  ProcessFile pf = new ProcessFile(i,j);
                  new Thread(pf).start();
                  int maximum = pf.getMaximum();
                  if (max > currentNr)
                       System.out.println("max is = " + max); 
             }
        }
     }
}
公共计算启动{
公共静态void main(字符串[]args){

对于(int i=0;i您必须等待线程完成作业。在这里,您运行一个线程,然后立即在主线程中调用pf.getMaximum()

我建议使用来获得线程执行的结果,并使用框架来创建线程

您还可以在每个线程上使用,然后在所有线程完成后检查结果

更新

如果你不想做任何重大改变,这个怎么样

可运行的:

public class ProcessFile implements Runnable {

    private ProcessFileListener listener;
    private int max;
    private int i;
    private int j;

    public ProcessFile(ProcessFileListener listener, int i, int j) {
        this.i = i;
        this.j = j;
        this.listener = listener;
    }

    public void run() {
        //Perform operations on the file
        listener.done(this);
    }

    public int getMaximum() {
        return this.max;
    }
}
听众:

public interface ProcessFileListener {
    void done(ProcessFile process);
}
主要问题:

public class Start implements ProcessFileListener {

    private int max = Integer.MIN_VALUE;

    @Override
    public synchronized void done(ProcessFile pf) {

        int maximum = pf.getMaximum();
        if (maximum > max) {
            max = maximum;
            System.out.println("max is = " + max);
        }
    }

    public static void main(String[] args) throws InterruptedException {

        ProcessFileListener listener = new Start();

        for (int i = 0; i <= 10; i++) {
            for (int j = 0; j <= 5; j++) {
                ProcessFile pf = new ProcessFile(listener, i, j);
                new Thread(pf).start();
            }
        }
    }
}
公共类开始实现ProcessFileListener{
private int max=Integer.MIN_值;
@凌驾
已完成公共同步作废(ProcessFile pf){
int max=pf.getmax();
如果(最大值>最大值){
最大值=最大值;
System.out.println(“max is=“+max”);
}
}
公共静态void main(字符串[]args)引发InterruptedException{
ProcessFileListener侦听器=新开始();

对于(int i=0;i
public int getMaximum(){return this.max;}
您的意思是什么?对不起,我编辑了这个问题我对多线程不太了解,但您不应该等待线程完成某种
。wait()
?这里有一个
join()
Thread
上的
方法,该方法将导致主线程阻塞,直到工作线程完成。但这种方法可能不正确。文件是否足够小,您可以将整个文件读取到RAM中?是否要在多个线程中拆分单个文件以并行处理?还是只尝试让每个线程都有一个线程ead在整个文件中搜索不同的条件?你能帮我举个例子吗?根据你说的,我需要等待每个线程完成作业。我尝试使用线程的主要目的是加快执行时间。也许我的方法是错误的,但如果我等待每个线程完成,我会得到相同的执行时间另一点。仅仅让每个线程处理相同的数据并没有多大帮助。您需要分割文件,以便每个线程完成其部分工作(与其他线程并行)。假设您的文件有100行。您可以运行4个线程:第一个线程在第1-25行中查找最大值,第二个线程在第26-50行中查找最大值,依此类推。然后等待所有线程完成,并从4个结果中选择最大值。无论如何,您都必须等待完成,否则您将得到部分结果。这有意义吗?是的,有意义。但我的问题有点复杂。上面的示例是一个简化的示例。实际上,我需要为gridSearch找到最佳参数,这就是为什么我每次都需要处理该文件。是否有一种方法可以创建10个线程,每个线程使用不同的参数处理该文件,然后逐个返回结果?如果尽快打印输出很重要,我会在run()结束时在作业本身中进行打印。您可以传递OutputStream使其更通用(即不使用System.out.println())。抱歉,现在没有更好的主意。实际上,您可以让主线程等待,并在子线程完成时收到子线程的通知,以便主线程可以检查其结果并执行任何需要的操作。但是,主线程必须等待(未完成),然后唤醒以处理每个线程的结果。