Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Performance_Thread Safety_Combinations - Fatal编程技术网

Java 在这种情况下,如何有效地使用线程?

Java 在这种情况下,如何有效地使用线程?,java,multithreading,performance,thread-safety,combinations,Java,Multithreading,Performance,Thread Safety,Combinations,我必须在一个文件中写入所有可能的组合,从彩票使用线程产生。例如: 0(第一个组合) 0 0 1(第二个组合) 02 . . . 最后。38(最后一个组合) 在我的主类中,我只使用一个线程,因为我不知道如何使用更多线程更快地写入文件 对于生成的数字,我使用6个循环,一个循环在另一个循环中,以这种方式: import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import ja

我必须在一个文件中写入所有可能的组合,从彩票使用线程产生。例如:

  • 0(第一个组合)
  • 0 0 1(第二个组合)
  • 02
    . . .
    最后。38(最后一个组合)
  • 在我的主类中,我只使用一个线程,因为我不知道如何使用更多线程更快地写入文件

    对于生成的数字,我使用6个循环,一个循环在另一个循环中,以这种方式:

    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.util.Scanner;
    
    public class Proceso extends Thread {
        File file = new File("lottery.txt");
        public Proceso(String msg) {
            super(msg);
        }
    
        public void run() {
            try {
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
                StringBuffer linea = new StringBuffer();
                for (int i = 0; i < 15;i++) {
                    for (int j = 0; j < 39; j++) {
                        for (int j2 =0; j2 < 39; j2++) {
                            for (int k = 0; k < 39; k++) {
                                for (int k2 = 0 ; k2 < 39; k2++) {
                                    for (int l = 0; l < 39; l++) {
                                        linea.append(i + " " +j + " " +j2 + " " +k + " " +k2 + " " +l + "\n");
                                        bw.write(linea.toString());
    
                                        }
                                }
                            }
                        }
                    }
                }
                bw.close();
            } catch (IOException e) {
    
                e.printStackTrace();
            }
    
        }
    
    
    }
    
    导入java.io.BufferedWriter;
    导入java.io.File;
    导入java.io.FileNotFoundException;
    导入java.io.FileOutputStream;
    导入java.io.IOException;
    导入java.io.OutputStreamWriter;
    导入java.util.Scanner;
    公共类Proceso扩展线程{
    File File=新文件(“lotket.txt”);
    公共进程(字符串消息){
    超级(味精);
    }
    公开募捐{
    试一试{
    BufferedWriter bw=新的BufferedWriter(新的OutputStreamWriter(新的FileOutputStream(file,true));
    StringBuffer linea=新的StringBuffer();
    对于(int i=0;i<15;i++){
    对于(int j=0;j<39;j++){
    对于(int j2=0;j2<39;j2++){
    对于(int k=0;k<39;k++){
    对于(int k2=0;k2<39;k2++){
    对于(int l=0;l<39;l++){
    线性附加(i+“”+j+“”+j2+“”+k+“”+k2+“”+l+“”\n);
    write(linea.toString());
    }
    }
    }
    }
    }
    }
    bw.close();
    }捕获(IOE异常){
    e、 printStackTrace();
    }
    }
    }
    
    而且文件(在执行过程中)的大小增加到8gb,我不得不停止它,因为我的电脑崩溃了

    编辑:
    如果我不能这样做,至少我可以在几乎相同的时间用两个不同的线程在同一个文件中写?如果我能做到这一点,我会怎么做?

    你可以先停下来。严肃地说:退一步

    首先,tkausl的评论是正确的,当IO性能成为瓶颈时,使用多个线程可能没有帮助。相反,让多个线程写入同一个文件可能并不都有帮助。此外,要做到这一点很难

    因此,如果有的话,您必须考虑将此任务分配到多个系统上。然后我们研究你的代码;很明显,使用这样的代码无法做到这一点

    这就是我的初衷:您的代码是非常低级的。其中几乎没有任何抽象将此任务中的不同活动彼此分离。只需在循环中循环。这是可能“完成”其工作的代码(或者可能会,如果“预期”输出更小);但它不包含任何有用的抽象概念,您需要“调整”它以适应您的实际需要

    长话短说:如果你真的想尝试多线程的东西;然后开始将代码转换为基于的解决方案。然后,当这起作用时,你可以学习流;并使用它们“并行”运行代码

    请记录:您的代码中有一个bug

    linea.append(i + " " +j + " " +j2 + " " +k + " " +k2 + " " +l + "\n");
    bw.write(linea.toString())
    
    会在缓冲区中添加一个新行;然后写入整个缓冲区。但是:线停留在你的缓冲区中

    因此,在这种情况下,“简单”的答案可能是:在写入内容后清除缓冲区!例如:
    linea.delete(0,linea.length())
    。顺便说一句:使用StringBuilder;不是字符串缓冲区。您可以简单地为每一行创建一个新的生成器(而不是一直使用/清除同一个生成器)

    很可能是因为StringBuffer不断增长而导致异常;直到你的内存用完

    最后一点:退一步仍然是这里要做的事情。如果我没有弄错的话,您要创建的文件将有38*38*38*38*38行, 这就构成了3.010.936.384,大约30亿个条目。假设每行包含10,15个字节。因此,您最终会得到一个大约30GB的文件。但是为什么呢?此文件将包含这些值的简单排列。 再加上一点数学知识。。。只有行号可以用来计算该行中的字符串!因为您可以将1和3.010.936.384之间的任何值映射到相应的“置换”

    所以,长话短说:不管哪个程序正在处理30GB的文件,它都不需要。你知道有多少排列;您可以轻松地计算排列任何需要这些排列的程序都可以做到!如果您可以如此轻松地计算数据,那么将30 GB的数据写入文件系统是没有意义的


    因此,本质上:忘记将这些东西写入文件。你没有你。这只会让你在以后的写作和阅读中浪费时间。你知道,“IO”仍然是最昂贵的事情。

    你从停止开始。严肃地说:退一步

    首先,tkausl的评论是正确的,当IO性能成为瓶颈时,使用多个线程可能没有帮助。相反,让多个线程写入同一个
    文件可能并不都有帮助。此外,要做到这一点很难

    因此,如果有的话,您必须考虑将此任务分配到多个系统上。然后我们研究你的代码;很明显,使用这样的代码无法做到这一点

    这就是我的初衷:您的代码是非常低级的。有阿尔莫