首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thread.start()不调用Thread.run()方法

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

Stack Overflow用户
提问于 2013-08-29 21:51:56
回答 4查看 2.4K关注 0票数 0

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

这是我的一个帖子:

代码语言:javascript
复制
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));
}
}

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

代码语言:javascript
复制
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();

    }
}

在运行我的代码后,我得到了如下结果:

代码语言:javascript
复制
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

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

我非常感谢任何人的帮助,因为我已经在这个东西上花费了太多的时间,不幸的是没有解决这个问题。

EN

回答 4

Stack Overflow用户

发布于 2013-08-29 22:38:49

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

System.out.print()使用锁定来确保线程不会相互重叠打印。因此,当您有两个线程,一个打印foo,另一个打印bar时,您可以获得foobarbarfoo,但决不会得到fboaro (=无混合)。

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

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

最后:您可以启动线程,但从不等待结果。所以发生的事情是,主线程启动线程,然后继续(可能终止)。然后,所有三个线程同时等待500ms,然后它们都尝试计算结果并同时打印出来。

正如您可能开始理解的那样,所有这些都相当复杂和恼人。这就是为什么Java6引入了并发框架,它解决了许多这样的问题。

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

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

相关信息:

  • Tutorial for Java Conurrency

(编辑以允许删除反对票。)

票数 5
EN

Stack Overflow用户

发布于 2013-08-29 22:25:18

您的结果可能隐藏在最后一个字符串中:"true2hi6falsetrue5hi2483falsehi720hi120“。所有线程都实际执行该命令:

代码语言:javascript
复制
System.out.print(NumbersOperations.getFactorial(number)); 

当循环结束时,因为他们必须等待0.5秒。您还有一个print方法来做这件事,而不是println,因此每个结果都被“粘贴”到另一个结果上。正如注释所示,线程不是单独执行的,它们不会等待前一个Thread的结束。

票数 0
EN

Stack Overflow用户

发布于 2013-08-30 01:39:49

moore需要做的一件事是:等待线程完成。我预计会有三次Thread.join()调用,否则您的程序可能会终止并中止线程(您没有将它们标记为守护进程,对吧?)他们才能打印出结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18512871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档