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
. . .
最后。38(最后一个组合)
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性能成为瓶颈时,使用多个线程可能没有帮助。相反,让多个线程写入同一个文件可能并不都有帮助。此外,要做到这一点很难 因此,如果有的话,您必须考虑将此任务分配到多个系统上。然后我们研究你的代码;很明显,使用这样的代码无法做到这一点 这就是我的初衷:您的代码是非常低级的。有阿尔莫