java-求助个Java多线程的demo问题

问题描述

求助个Java多线程的demo问题
public class ThreadDemo {

public static void main(String[] args) {    new ThreadDemo().run();}public void run() {    Family f = new Family();    new Thread(fqizi"").start();    new Thread(fzhangfu"").start();    while (true) {        if (f.getTimes() >= 2) {            f.show();            break;        }    }}class Family implements Runnable {    private int saveMoney;    private int getMoney;    private int curMoney;// 当前取的钱    private int times = 0;    // 可以直接创建一个对象来作为同步锁的钥匙    Object key = new Object();    public Family() {        saveMoney = 10000;        getMoney = 2000;        curMoney = 0;    }    public int getTimes() {        return times;    }    @Override    public void run() {        // TODO Auto-generated method stub        getMoney();    }    // 同步方法默认使用this作为钥匙    public synchronized void getMoney() {        System.out.println(Thread.currentThread().getName() + ""qule"" + getMoney);        curMoney += getMoney;        int temp = saveMoney - getMoney;        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        saveMoney = temp;        times++;        //System.out.println(times);    }    public void show() {        System.out.println(""yinhanghaiyou"" + saveMoney + ""jialihaiyou"" + curMoney);    }}

}

正常运行的时候会卡死在while循环那里Debug模式下正常如果在while循环内添加一条输出语句程序也是正常的求解是什么问题

解决方案

public int getTimes() {
return times;
}
//times非volatile的,因此主线程调用该方法的时候,并不会要求刷新缓存所以执行到 if (f.getTimes() >= 2) 的时候,条件一直不满足。
你将times的定义加上volatile看下就对了。
至于为何debug或则加上sysout后就正确,我估计是因为由于加长了主线程的执行时间,导致主线程的缓存被刷新了。

解决方案二:
这可奇了,运行了好几遍,只有一种输出:
qiziqule2000
zhangfuqule2000
yinhanghaiyou6000jialihaiyou4000
不知卤煮问题如何来的?

解决方案三:
分析了下,你的代码没有问题,锁同步代码也是正确的,需要改进的是你的getTimes方法操作了共享成员变量times,也需要同步处理,但是不影响执行结果。
我的开发环境是jdk1.8+Eclipse4.5,运行N>10次,结果为:

qiziqule2000zhangfuqule2000yinhanghaiyou6000jialihaiyou4000
时间: 2024-10-06 03:24:24

java-求助个Java多线程的demo问题的相关文章

多线程问题-新手求助关于Java多线程中启动线程问题

问题描述 新手求助关于Java多线程中启动线程问题 public class Example15_1 { /** * @param args */public static void main(String[] args) { // TODO Auto-generated method stub SpeakHello speakHello; SpeakNinhao speakNinhao; speakHello = new SpeakHello(); speakNinhao= new Speak

求助,java多线程的问题,synchronized关键字不起作用

问题描述 求助,java多线程的问题,synchronized关键字不起作用 public class VoTest { private int num=1; private void increase(){ ** synchronized (this){ this.num++; }** } private int read(){ return this.num; } public static void main(String[] args) { final VoTest test=new V

java excel导入-java求助,excel导入功能遇到的问题

问题描述 java求助,excel导入功能遇到的问题 系统中有个excel导入数据的功能,一般能正常使用,当有多个用户并发导入操作,肯能会造成导入功能完全不可用,需重启应用后导入功能才能恢复正常.不知其他同学是否遇到过此类问题,求解答,万分感谢! 解决方案 要用多线程方案,可以参考

编程-[求助]使用java在指定的目录下实现文件的模糊搜索

问题描述 [求助]使用java在指定的目录下实现文件的模糊搜索 一.功能要求: 用户单击"选择地址"按钮,程序自动打开文件夹选择器(如图2),用户选定用户选择目标文件夹后,输入文件名(可包含"*"表示任意连续多个字符,"?"示任意一个字符),选择文件的扩展名.程序自动获取指定目录下满足条件的所有文件,并显示在窗体中(如图1).二.关键技术: 首先获取指定目录下的文件数组,再从该数组中查询满足条件的文件.三.实现的图形用户界面如下: 解决方案 已经

Java 程序中的多线程

程序|多线程 在Java程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持.本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观.读完本文以后,用户应该能够编写简单的多线程程序. 为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 - 打印机.磁盘.数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含

线程-新人求助关于java.lang.StackOverflowError的异常问题

问题描述 新人求助关于java.lang.StackOverflowError的异常问题 public class ProcessRow { Properties source= new Properties(); { try { FileInputStream fis = new FileInputStream(new File( inputPropertieName())); InputStreamReader isr = new InputStreamReader(fis, "UTF-8&

java-菜鸟求助:Java有n个人,1到3报数,报数为3的人退出,最后留下的人原来的标号是多少

问题描述 菜鸟求助:Java有n个人,1到3报数,报数为3的人退出,最后留下的人原来的标号是多少 import java.util.Scanner;public class Yuesefu{ public static void main(String ags[]){ Scanner gain=new Scanner(System.in); System.out.println(""请输入总共的人数:""); int length=gain.nextInt();//

求助:java 如何在不缩放图片大小而对图片加水印

问题描述 求助:java 如何在不缩放图片大小而对图片加水印 如题:java 如何在不缩放图片大小而对图片加水印,网上很多方法都是加完水印图片就被缩放了 解决方案 没回应啊,帮自己顶一下 解决方案二: 楼主解决问题了吗?我也想问这个

c语言-求助一个java语言的一个for循环语句

问题描述 求助一个java语言的一个for循环语句 for(int i=2,j=1; j<10; i=(i==9)?(((++j)/j)+1):(i+1)){ System.out.printf("%d*%d=%2d%c",i,j,i*j, ((i==9)?'n':' ')); } 输出结果是99乘法表. 这个for循环里的++j为什么不能换成j+1啊? 谢谢各位了. 解决方案 ++j是改变变量值的 j+1是不改变变量值的 解决方案二: ++j 等效于j=j+1 你用j+1 原j