【发布时间】:2013-05-17 08:49:58
【问题描述】:
我尝试了下面的代码。我从其他一些帖子中获取了这段代码,根据作者的说法是正确的。但是当我尝试跑步时,它并没有给我确切的结果。
这主要是顺序打印偶数和奇数。
public class PrintEvenOddTester {
public static void main(String ... args){
Printer print = new Printer(false);
Thread t1 = new Thread(new TaskEvenOdd(print));
Thread t2 = new Thread(new TaskEvenOdd(print));
t1.start();
t2.start();
}
}
class TaskEvenOdd implements Runnable {
int number=1;
Printer print;
TaskEvenOdd(Printer print){
this.print = print;
}
@Override
public void run() {
System.out.println("Run method");
while(number<10){
if(number%2 == 0){
System.out.println("Number is :"+ number);
print.printEven(number);
number+=2;
}
else {
System.out.println("Number is :"+ number);
print.printOdd(number);
number+=2;
}
}
}
}
class Printer {
boolean isOdd;
Printer(boolean isOdd){
this.isOdd = isOdd;
}
synchronized void printEven(int number) {
while(isOdd){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Even:"+number);
isOdd = true;
notifyAll();
}
synchronized void printOdd(int number) {
while(!isOdd){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Odd:"+number);
isOdd = false;
notifyAll();
}
}
有人可以帮我解决这个问题吗?
编辑 预期结果: 奇数:1 偶数:2 奇数:3 偶数:4 奇数:5 偶数:6 奇数:7 偶数:8 奇数:9
【问题讨论】:
-
实际结果是什么,您的预期结果是什么?
-
数字从 1 开始,你只能将它增加 2。因此它永远不会是偶数。
-
这不是调试服务...
-
对于每一位来到这里的学生:请告诉你的导师,虽然这个练习可能会教你一些关于如何控制线程的知识,但这是一个非常可怕的示例为什么 使用线程。如果您希望程序以特定顺序(例如,1、2、3,...)执行某些事情(例如,打印数字);那么绝对最好的方法就是在一个线程中完成这些事情。每个多线程程序都需要线程之间的一些同步,但是你使用的同步越多,你从线程中获得的好处就越少。这个程序实际上得到了负面的好处。
-
没有理由让线程交替打印数字,甚至撇开关于增量的错误。您的期望是误入歧途的,未引用的“其他一些代码”也是如此。 SO 不是针对任意 Internet 垃圾的验证服务。
标签: java multithreading synchronization