在多线程中,为什么这两种写法有非常大的结果性的区别

立志做一个佳娃~ 2014-04-24 11:35:36
public class Run implements Runnable {

public static boolean isContinuePrint = true;

public boolean isContinuePrint() {
return isContinuePrint;
}

public void setContinuePrint(boolean isContinuePrint) {
this.isContinuePrint = isContinuePrint;
}

public void printStringMethod() {
while (isContinuePrint == true) {
System.out.println("run printStringMethod threadName="
+ Thread.currentThread().getName());
}
}

@Override
public void run() {
printStringMethod();
}

public static void main(String[] args) {
try {
//差不多的代码,为什么我不死循环!
Run printStringService = new Run();
new Thread(printStringService).start();
Thread.sleep(1000);
System.out.println("我要停止它!stopThread="
+ Thread.currentThread().getName());
Run.isContinuePrint = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}





public class Test {// volatile
private static boolean stop = false;

public static void main(String[] args) throws Exception {
Thread t = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!stop) {
i++;
// System.out.println("hello");
}
}
});
t.start();

Thread.sleep(1000);
System.out.println("Stop Thread");
stop = true;
}
}


就是多线程的示例,为什么一个不死循环一个死循环呢?我感觉是变量在内存的管理,但说不清,请教一下各位!
...全文
453 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
呵呵和volatile有关!感谢 大家!
yuhouqingchen_2648 2014-05-05
  • 打赏
  • 举报
回复
引用 3 楼 ghyghost 的回复:
另外我还发现,如果将循环中的system.out.println()去掉的话,2个代码都是死循环,, 这个结论出来,说明死循环和println()有关,在println()里面使用了synchronized,说明与synchronized有关啊,有没有权威的资料 证明 synchronized可以解除死循环
为什么我的就是没有出现死循环呢?
yuhouqingchen_2648 2014-05-05
  • 打赏
  • 举报
回复
我的也没出现死循环啊???什么情况???
a943013827 2014-04-26
  • 打赏
  • 举报
回复
我运行了20遍也没出现死循环啊
XINGXING197554 2014-04-25
  • 打赏
  • 举报
回复
OKOKOKOKOKOK
xuebichongkafei 2014-04-25
  • 打赏
  • 举报
回复
引用 8 楼 ghyghost 的回复:
xuebichongkafei 你用-server JVM的参数试一下,, 你的机器必须是64bit的JDK 在run application中设置JVM参数为:-server
我的系统是64位的,但是JDK我记得不是64位的
  • 打赏
  • 举报
回复
xuebichongkafei 你用-server JVM的参数试一下,, 你的机器必须是64bit的JDK 在run application中设置JVM参数为:-server
  • 打赏
  • 举报
回复
另外我还发现,如果将循环中的system.out.println()去掉的话,2个代码都是死循环,, 这个结论出来,说明死循环和println()有关,在println()里面使用了synchronized,说明与synchronized有关啊,有没有权威的资料 证明 synchronized可以解除死循环
  • 打赏
  • 举报
回复
你用的是win7系统吗,,而且用的是64bit的JDK?
卡卡吉利 2014-04-24
  • 打赏
  • 举报
回复
多次测试,并没有死循环,哪一个死循环了?
xuebichongkafei 2014-04-24
  • 打赏
  • 举报
回复
我用你的代码运行,两个都没有死循环!楼主贴出运行效果来吧
xuebichongkafei 2014-04-24
  • 打赏
  • 举报
回复
没有死循环啊,怎么就死循环了呢?
  • 打赏
  • 举报
回复
呵呵,猜的也有理由,但理由是理由啊,不等于答案,哈哈! 来看这个URL: hellosure.iteye.com/blog/1121157
EggItayi 2014-04-24
  • 打赏
  • 举报
回复
是不是你CPU太慢了 你这样疯狂print ,资源被那个线程全抢占了,主线程不能改变值 猜的。。。

62,612

社区成员

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

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