在我的项目中,有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),但结果只出现在控制台中,没有任何睡眠.
我会感激任何帮助,因为我已经花了太多时间在这些东西上,不幸的是没有解决问题.
这里有一些事情会让你感到困惑.让我们从一些不明显的事情开始:
System.out.print()使用锁定来确保线程不会相互打印.所以,当你有两个线程,一个印刷foo和其他印刷品bar,就可以得到两种foobar或barfoo但从来没有fboaro(=没有混合).
这也意味着当一个线程(三个计算线程中的主线程或一个线程)打印出某些东西时,所有其他同时想要打印的线程都会等待.
Next:启动线程不会对它们进行排队.如果启动N个线程,系统将同时运行它们的所有代码.如果他们都睡了500毫秒,那么这种睡眠就会平行.如果希望线程按特定顺序执行,则必须使用队列和锁.
最后:你启动线程,但你永远不会等待结果.所以会发生什么是主线程启动线程然后继续(可能终止).然后所有三个线程同时等待500ms,然后他们都尝试计算结果并同时打印它.
你可能已经开始明白了,这一切都非常复杂和烦人.这就是为什么Java 6引入了解决许多这些问题的并发框架.
简而言之,不要再创建线程了.创建Callables返回所需结果的内容,然后将其提交给ExecutorService.该服务将运行它们并返回Futures.然后,您可以查询结果的未来.
这样,您就不必处理低级线程问题,同步,锁和队列.
有关:
(编辑以允许删除downvote.)
| 归档时间: |
|
| 查看次数: |
2187 次 |
| 最近记录: |