Thread.start()不调用Thread.run()方法

Lan*_*tka 0 java

在我的项目中,有3个类扩展了Thread,每个类都对整数进行了一些计算.我需要运行它们来获取所有三个计算值.需要对特定范围内的所有整数执行此过程.

这是我的一个主题:

public class FactorialNumber extends Thread {
private int number;

public void setNumber(int number) {
    this.number = number;
}

public void run() {
    try {
        sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace(); 
    }
    System.out.print(NumbersOperations.getFactorial(number));
}
}
Run Code Online (Sandbox Code Playgroud)

这是一个尝试启动线程的方法:

public static void getThreevalues() throws InterruptedException {
    int startOfRange = getBorder("Enter the left border of range: ");
    int endOfRange = getBorder("Enter the right border of range: ");
    for(int i = startOfRange; i <= endOfRange; i++) {
        PrimeNumber primeNumber = new PrimeNumber();
        FibonachiNumber fibonachiNumber = new FibonachiNumber();
        FactorialNumber factorialNumber = new FactorialNumber();
        primeNumber.setNumber(i);
        fibonachiNumber.setNumber(i);
        factorialNumber.setNumber(i);
        System.out.print("Number: " + i);
        System.out.print(" is prime number ");
        primeNumber.start();
        System.out.print(". Fibonachi - " );
        fibonachiNumber.start();
        System.out.print(". Factorial - ");
        factorialNumber.start();
        System.out.println();

    }
}
Run Code Online (Sandbox Code Playgroud)

运行我的代码后,我得到了这个:

Number: 3 is prime number . Fibonachi - . Factorial - 
Number: 4 is prime number . Fibonachi - . Factorial - 
Number: 5 is prime number . Fibonachi - . Factorial - 
Number: 6 is prime number . Fibonachi - . Factorial - 
true2hi6falsetrue5hi2483falsehi720hi120
Run Code Online (Sandbox Code Playgroud)

据我所知,start()不会调用run()方法.在我的run方法中有睡眠(500),但结果只出现在控制台中,没有任何睡眠.

我会感激任何帮助,因为我已经花了太多时间在这些东西上,不幸的是没有解决问题.

Aar*_*lla 5

这里有一些事情会让你感到困惑.让我们从一些不明显的事情开始:

System.out.print()使用锁定来确保线程不会相互打印.所以,当你有两个线程,一个印刷foo和其他印刷品bar,就可以得到两种foobarbarfoo但从来没有fboaro(=没有混合).

这也意味着当一个线程(三个计算线程中的主线程或一个线程)打印出某些东西时,所有其他同时想要打印的线程都会等待.

Next:启动线程不会对它们进行排队.如果启动N个线程,系统将同时运行它们的所有代码.如果他们都睡了500毫秒,那么这种睡眠就会平行.如果希望线程按特定顺序执行,则必须使用队列和锁.

最后:你启动线程,但你永远不会等待结果.所以会发生什么是主线程启动线程然后继续(可能终止).然后所有三个线程同时等待500ms,然后他们都尝试计算结果并同时打印它.

你可能已经开始明白了,这一切都非常复杂和烦人.这就是为什么Java 6引入了解决许多这些问题的并发框架.

简而言之,不要再创建线程了.创建Callables返回所需结果的内容,然后将其提交给ExecutorService.该服务将运行它们并返回Futures.然后,您可以查询结果的未来.

这样,您就不必处理低级线程问题,同步,锁和队列.

有关:

(编辑以允许删除downvote.)