当输入为一百万时,Java冻结

时间:2018-12-23 00:33:04

标签: java

当我输入一百万作为输入数字时,程序将冻结。我该如何解决?

我尝试将第二个for循环分隔为第二个功能,但这没用。

import java.io.*;
public class Array {
public static void main(String[] args) {
  String line = System.console().readLine("How many digits of Pi do you want? ");
  int n = Integer.parseInt(line);

  int columns = (int)(10.0*n/3.0);

  int[][] makedigitsofpi = new int[columns][2];
  makedigitsofpi[0][0] = 30;
  makedigitsofpi[0][1] = 10;
  for(int i = 1; i < columns; i++) {
           makedigitsofpi[i][0] = i;
           makedigitsofpi[i][1] = i*2+1;
  }
  int[] make2s = new int[columns];
  for(int i = 0; i < columns; i++) {
            make2s[i] = 2;
  }
  int[] timesby10 = new int[columns];
  int[] thirdrow = new int[columns];
  int[] fourrow = new int[columns];
  int[] fifthrow = new int[columns];
  for(int four_rows = 0; four_rows < n; four_rows++) {
         for(int i = 0; i < columns; i++) {
               timesby10[i] = make2s[i]*10;
         }
         for(int column = (columns - 1); column >= 0; column--) {
                if(columns == (column + 1)) { //last column
            thirdrow[column] = 0; // add last
            }
            else { // Third Row
                    int[] cell0 = makedigitsofpi[(column+1)];
                    int cellfour = fourrow[(column+1)];
                    int cellfive = fifthrow[(column+1)];
            int d = cellfour - cellfive;
                thirdrow[column] = (d*cell0[0])/cell0[1];
            }
         }
     }
  }
}

我需要我的程序能够处理大量数字。该程序只是我项目的开始。该项目将创建一个程序,该程序将Pi生成为无限数量的数字。

1 个答案:

答案 0 :(得分:1)

  

我该如何解决?

在后台线程中完成工作。

您的代码正在运行,使用了处理器,正在进行数学运算。

“冻结”是因为它没有处理您的输入并且没有完成他的工作。

要尽早完成工作,请减少课程数量。

要处理输入,您需要在单独的Thread中对循环进行处理 该代码将不会更快地执行,但是您将不会有“冻结”的感觉。在这种情况下,如果您有一个要启动的按钮,则该按钮将被按下并保持按下状态,而无需其他输入。

在多线程上下文中,按钮将释放,您可以从“开始”状态切换到“停止”状态,如果再次按下该按钮,则可以设置布尔变量值切换:ex shouldCalculate = false;循环执行,如果检查该值(如果为false),则退出线程,仅此而已。

请看一下here以使用线程。