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