在我的项目中,有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));
}
}这是一个尝试启动线程的方法:
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();
}
}在运行我的代码后,我得到了如下结果:
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),但结果只出现在控制台中,没有任何睡眠。
我非常感谢任何人的帮助,因为我已经在这个东西上花费了太多的时间,不幸的是没有解决这个问题。
发布于 2013-08-29 22:38:49
这里发生的一些事情会让你感到困惑。让我们从一些不明显的事情开始:
System.out.print()使用锁定来确保线程不会相互重叠打印。因此,当您有两个线程,一个打印foo,另一个打印bar时,您可以获得foobar或barfoo,但决不会得到fboaro (=无混合)。
这也意味着当一个线程(主线程或三个计算线程中的一个)打印一些东西时,所有其他也想要打印同一时间的线程都将等待。
下一步:启动线程不会对它们进行排队。如果您启动了N个线程,系统将同时运行这些线程的所有代码。如果他们都睡了500毫秒,那么这种睡眠将是并行的。如果希望线程按特定顺序执行,则必须使用队列和锁。
最后:您可以启动线程,但从不等待结果。所以发生的事情是,主线程启动线程,然后继续(可能终止)。然后,所有三个线程同时等待500ms,然后它们都尝试计算结果并同时打印出来。
正如您可能开始理解的那样,所有这些都相当复杂和恼人。这就是为什么Java6引入了并发框架,它解决了许多这样的问题。
简而言之,不要再创建线程了。创建返回所需结果的Callables,然后将其提交给ExecutorService。服务将运行它们并返回Future%s。然后,您可以查询未来的结果。
这样,您就不必处理低级线程问题、同步、锁和队列。
相关信息:
(编辑以允许删除反对票。)
发布于 2013-08-29 22:25:18
您的结果可能隐藏在最后一个字符串中:"true2hi6falsetrue5hi2483falsehi720hi120“。所有线程都实际执行该命令:
System.out.print(NumbersOperations.getFactorial(number)); 当循环结束时,因为他们必须等待0.5秒。您还有一个print方法来做这件事,而不是println,因此每个结果都被“粘贴”到另一个结果上。正如注释所示,线程不是单独执行的,它们不会等待前一个Thread的结束。
发布于 2013-08-30 01:39:49
moore需要做的一件事是:等待线程完成。我预计会有三次Thread.join()调用,否则您的程序可能会终止并中止线程(您没有将它们标记为守护进程,对吧?)他们才能打印出结果。
https://stackoverflow.com/questions/18512871
复制相似问题