学习Java时看Java编程思想时的一个问题

GFive555 2017-07-20 01:27:04
public class EvenGenerator {

private volatile boolean canceled = false;
private int currentEvenValue = 0;
public int next() {
++currentEvenValue;
Thread.yield();
++currentEvenValue;
return currentEvenValue;
}
public void cancel(){
canceled = true;
}
public boolean isCancel(){
return canceled;
}
}
public class EvenChecker implements Runnable{

private EvenGenerator even;
private final int id ;
public EvenChecker(EvenGenerator even,int id){
this.even = even;
this.id = id;

}
public void run() {
while(!even.isCancel()){
int val = even.next();

if(val%2 != 0){
System.out.println(val + " not even");
even.cancel();
}
System.out.println(val + " even");
if(count++ >20){
return;
}
}

}


}
public class Init {
public static void main(String[] args) {

ExecutorService exs = Executors.newCachedThreadPool();
for(int i=0;i<3;i++)
exs.execute(new EvenChecker(new EvenGenerator(),i));
exs.shutdown();
}
}

书上说这样可能出来奇数,但是我运行了半天都没有一个奇数而且每次是三个偶数同时出来
...全文
160 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
GFive555 2017-07-20
  • 打赏
  • 举报
回复
自学Java可能问了一些比较无聊的问题,感谢大神的回答。谢谢!!
galiniur0u 2017-07-20
  • 打赏
  • 举报
回复
因为test共享了这个EvenGenerator,而EvenGenerator的next方法非线程安全的,所以会产生奇数的情况
GFive555 2017-07-20
  • 打赏
  • 举报
回复
引用 4 楼 soton_dolphin 的回复:
[quote=引用 2 楼 GFive555 的回复:] [quote=引用 1 楼 soton_dolphin 的回复:] 你创建了三个线程,每个线程都有一个独立的EvenChecker, 每个EventChecker都有独立的EvenGenerator. evenGenerator.next() 返回的是双数啊。再看看代码是不是敲错了
是我改了一下代码,在原来的代码EvenChecker里面有一个test方法
public static void test(EvenGenerator gen){
		ExecutorService exs = Executors.newCachedThreadPool();
		for(int i=0;i<3;i++){
			exs.execute(new EvenChecker(gen, 10));
		}
		exs.shutdown();
	}
主函数为
public static void main(String[] args) {

		EvenChecker.test(new EvenGenerator());
	}
这样就有奇数 ,这是为啥啊????[/quote] 因为test里面共享了一个EvenGenerator[/quote] 嗯,明白了,谢谢。 但是那个结果里为什么会有7 是偶数这样的结果
soton_dolphin 2017-07-20
  • 打赏
  • 举报
回复
引用 2 楼 GFive555 的回复:
[quote=引用 1 楼 soton_dolphin 的回复:] 你创建了三个线程,每个线程都有一个独立的EvenChecker, 每个EventChecker都有独立的EvenGenerator. evenGenerator.next() 返回的是双数啊。再看看代码是不是敲错了
是我改了一下代码,在原来的代码EvenChecker里面有一个test方法
public static void test(EvenGenerator gen){
		ExecutorService exs = Executors.newCachedThreadPool();
		for(int i=0;i<3;i++){
			exs.execute(new EvenChecker(gen, 10));
		}
		exs.shutdown();
	}
主函数为
public static void main(String[] args) {

		EvenChecker.test(new EvenGenerator());
	}
这样就有奇数 ,这是为啥啊????[/quote] 因为test里面共享了一个EvenGenerator
GFive555 2017-07-20
  • 打赏
  • 举报
回复
产生的结果为什么也这么奇怪? 4 even 5 not even 3 not even 3 even 7 not even 5 even 7 even
GFive555 2017-07-20
  • 打赏
  • 举报
回复
引用 1 楼 soton_dolphin 的回复:
你创建了三个线程,每个线程都有一个独立的EvenChecker, 每个EventChecker都有独立的EvenGenerator. evenGenerator.next() 返回的是双数啊。再看看代码是不是敲错了
是我改了一下代码,在原来的代码EvenChecker里面有一个test方法
public static void test(EvenGenerator gen){
		ExecutorService exs = Executors.newCachedThreadPool();
		for(int i=0;i<3;i++){
			exs.execute(new EvenChecker(gen, 10));
		}
		exs.shutdown();
	}
主函数为
public static void main(String[] args) {

		EvenChecker.test(new EvenGenerator());
	}
这样就有奇数 ,这是为啥啊????
soton_dolphin 2017-07-20
  • 打赏
  • 举报
回复
你创建了三个线程,每个线程都有一个独立的EvenChecker, 每个EventChecker都有独立的EvenGenerator. evenGenerator.next() 返回的是双数啊。再看看代码是不是敲错了

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧