无法使用异常在Java中运行线程

时间:2016-10-16 06:19:24

标签: java eclipse multithreading primes

使用异常修改了素数的程序,但无法在Eclipse中运行。为什么呢?

public class PrimeThreads {
    public static void main(String[] arguments) {
        PrimeThreads pt = new PrimeThreads(arguments);
    }

    public PrimeThreads(String[] arguments) {
        PrimeFinder[] finder = new PrimeFinder[arguments.length];
        for (int i = 0; i < arguments.length; i++) {
            try {
                long count = Long.parseLong(arguments[i]);
                finder[i] = new PrimeFinder(count);
                System.out.println("Looking for prime " + count);
            } catch (NumberFormatException nfe) {
                System.out.println("Error: " + nfe.getMessage());
            } catch (NegativeNumberException nne) {
                System.out.println("Error: " + nne.getMessage());
            }
        }
        boolean complete = false;
        while (!complete) {
            complete = true;
            for (int j = 0; j < finder.length; j++) {
                if (finder[j] == null) continue;
                if (!finder[j].finished) {
                    complete = false;
                } else {
                    displayResult(finder[j]);
                    finder[j] = null;
                }
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                // do nothing
            }
        }
    }

    private void displayResult(PrimeFinder finder) {
        System.out.println("Prime " + finder.target
            + " is " + finder.prime);
    }
}

运行之后,输出屏幕似乎什么也没发生,它应该不是。 OMG!

以下是PrimeFinder的代码:

public class PrimeFinder implements Runnable{
    public long target;
    public long prime;
    public boolean finished = false;
    private Thread runner;

    PrimeFinder(long inTarget) throws NegativeNumberException {
        if (inTarget < 0) {
            NegativeNumberException nne = new NegativeNumberException("Negative numbers not allowed: " + inTarget);
            throw nne;
        }
        target = inTarget;
        if (runner == null) {
            runner = new Thread(this);
            runner.start();
        }
    }

    public void run() {
        long numPrimes = 0;
        long candidate = 2;

        while (numPrimes < target) {
            if (isPrime(candidate)) {
                numPrimes++;
                prime = candidate;
            }
            candidate++;
        }
        finished = true;
    }

    boolean isPrime(long checkNumber) {
        double root = Math.sqrt(checkNumber);
        for (int i = 2; i <=root; i++) {
            if (checkNumber % i == 0)
                return false;
        }
        return true;        
    }

    class NegativeNumberException extends Exception {
        NegativeNumberException() {
            super();
        }
        NegativeNumberException(String message) {
            super(message);
        }

    }   
}

0 个答案:

没有答案