纠正和缩小Java程序

时间:2015-10-29 22:19:57

标签: java multithreading algorithm syntax logic

我想我几乎已经找到了我的java程序。它旨在读取文本文件并使用10个不同的线程查找最大的整数。我收到此错误:

Error:(1, 8) java: class Worker is public, should be declared in a file named Worker.java

我觉得我的代码可能比它需要的更复杂,所以我试图弄清楚如何缩小它的大小,同时修复上面的错误。我将非常感谢您对此事的任何帮助,如果我能澄清任何事情,请告诉我。此外,"工人" class必须是一个单独的文件?我将它添加到同一个文件中但得到上面的错误。

import java.io.BufferedReader;
import java.io.FileReader;

public class datafile {

    public static void main(String[] args) {
        int[] array = new int[100000];
        int count;
        int index = 0;
        String datafile = "dataset529.txt"; //string which contains datafile
        String line; //current line of text file

        try (BufferedReader br = new BufferedReader(new FileReader(datafile))) { //reads in the datafile
            while ((line = br.readLine()) != null) { //reads through each line
                array[index++] = Integer.parseInt(line); //pulls out the number of each line and puts it in numbers[]
            }
        }



            Thread[] threads = new Thread[10];
            worker[] workers = new worker[10];


            int range = array.length / 10;
            for (count = 0; count < 10; count++) {
                int startAt = count * range;
                int endAt = startAt + range;
                workers[count] = new worker(startAt, endAt, array);

            }

            for (count = 0; count < 10; count++) {
                threads[count] = new Thread(workers[count]);
                threads[count].start();
            }

            boolean isProcessing = false;
            do {
                isProcessing = false;
                for (Thread t : threads) {
                    if (t.isAlive()) {
                        isProcessing = true;
                        break;
                    }
                }
            } while (isProcessing);

            for (worker worker : workers) {
                System.out.println("Max = " + worker.getMax());
            }
        }


    }


     public  class worker implements Runnable {

        private int startAt;
        private int endAt;
        private int randomNumbers[];

        int max = Integer.MIN_VALUE;

        public worker(int startAt, int endAt, int[] randomNumbers) {
            this.startAt = startAt;
            this.endAt = endAt;
            this.randomNumbers = randomNumbers;
        }

        @Override
        public void run() {
            for (int index = startAt; index < endAt; index++) {

                if (randomNumbers != null && randomNumbers[index] > max)
                    max = randomNumbers[index];
            }
        }

        public int getMax() {
            return max;
        }

    }

1 个答案:

答案 0 :(得分:1)

我已经写了一些评论,但我将把它们全部收集到一个答案中,以便将来任何人都可以看到汇总信息:

readtextfile类的源代码末尾(每个java命名约定应为ReadTextile),你有太多的结束括号,

    } while (isProcessing);

    for (Worker worker : workers) {
        System.out.println("Max = " + worker.getMax());
    }
}

}
}
        }

以上应该在击中最左边一列的第一个支撑上结束。在制作任何Java类时,这是一个很好的经验法则,如果你有一个以上的左支撑,或者你的最后一个支撑不是很远,你可能在某个地方犯了一个错误,应该检查你的大括号。 / p>

至于您的文件问题您应该将所有类命名为Java conventions,并且每个类应存储在名为ClassName.java的文件中(区分大小写)。 EG:

public class ReadTextFile应存储在ReadTextFile.java

您也可以将Worker作为内部类。要做到这一点,你几乎可以将源代码复制到ReadTextFile类中(确保它在main方法之外)。有关内部类的详细信息,请参阅this教程。

至于问题的其余部分Code Review SE是适当的地方,那里的聪明人可能会提供比我更好的答案。但是我也建议使用10个线程可能不是查找文本文件中最大int的最有效方法(在开发和执行时间)。