银行存取款顺序问题

银行存取款顺序问题

package com.zzh.bank;

public class Test {

	public static void main(String[] args) {
		// 创建帐户,给定余额为1000
		Bank bank=new Bank("1001",1000);
		//创建线程对象
		SaveAccount sa=new SaveAccount(bank);
		DrawAccount da=new DrawAccount(bank);
		Thread save=new Thread(sa);
		Thread draw=new Thread(da);
		save.start();
		draw.start();
		try {
			
			draw.join();
			save.join();
			
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(bank);
	}

}

draw.join();
save.join();
为什么这两个代码调换顺序,都会先执行存款?再执行取款?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕小脸 2021-08-20 10:05:01

同学你好,

1、不使用join方法,当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完,程序才会退出。

2、 因为draw、save线程调用了join方法,调用了join()方法的线程会优先执行,故主线程会在其后执行;

3、要了解join()方法的作用是等待调用该方法的线程结束后才能执行。也就是说当你线程调用该方法时,join就会被执行

祝学习愉快~


好帮手慕小小 2021-08-19 10:43:22

同学你好,因为是先save.start(),再draw.start(),而save线程中执行的方法带有synchronized,所以每次都是先执行存款再执行取款。代码如下:

http://img1.sycdn.imooc.com//climg/611dc4440907d3e300000000.jpg

http://img1.sycdn.imooc.com//climg/611dc53e0976fa9305660757.jpg

祝学习愉快~

  • 提问者 做条咸鱼才最好 #1

    那join方法不就无意义了吗

    2021-08-19 10:45:06
  • 同学你好,join方法的作用是:等待调用该方法的线程结束后才能执行,也就是说,在线程a中调用线程b的join(),此时线程a就进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态。

    在此段代码中使用join方法是为了执行完save、draw线程后,再执行主线程main。代码中若未使用join,则执行结果可能是:先输出bank后再执行save、draw线程,同学可将join部分代码注释掉观察其运行结果。

    http://img1.sycdn.imooc.com//climg/611dcc95093520b303140081.jpg

    public static void main(String[] args) {
    	// 创建帐户,给定余额为1000
    	Bank bank=new Bank("1001",1000);
    	//创建线程对象
    	SaveAccount sa=new SaveAccount(bank);
    	DrawAccount da=new DrawAccount(bank);
    	Thread save=new Thread(sa);
    	Thread draw=new Thread(da);
    	save.start();
    	draw.start();
    //		try {
    //			draw.join();//取款
    //			save.join();//存款
    //		} catch (InterruptedException e) {
    //			e.printStackTrace();
    //		}
    	System.out.println(bank);
    }

    祝学习愉快~

    2021-08-19 11:20:47
  • 谢谢解答!

    2021-08-19 21:18:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师