2020-11-09

编程题8

class Account                              
{
    volatile private int value;
    void put(int i)                       
	{
    	synchronized(this) {
		value = value + i; 
		System.out.println("存入"+i+" 账上金额为:"+value);
    	}
	}
    synchronized int get(int i)                         
    {   
		if (value>i)
				value = value - i;             
			else                               
			{   i = value;
				value = 0;                     
			}
		System.out.println("取走"+i+" 账上金额为:"+value);
      return i;                      
    }    
}
class  Save implements Runnable            
{
	int a=2000;
    private Account a1;     
    public Save(Account a1)
    {
        this.a1 = a1;
    }
    public void run()
    {
        while(a-->0){
			a1.put(100);			
	    }
    }
}
class Fetch implements Runnable            
{
	int a=2000;
    private Account a1;
    public Fetch(Account a1)
    {this.a1 = a1 ;}
    public void run()
    {       
		while(a-->0){		
			a1.get(100);			
		}		
    }
}
public class Test{
	public static void main(String[] args){
       Account a1 = new Account();
       new Thread(new Save(a1)).start(); 
       new Thread(new Fetch(a1)).start();
	}
}

put方法的代码块被监视,get函数被监视,保证了value的正确性,输出结果为存钱取钱的随机顺序

编程题9

package birthday;

class Account                              
{
	int b=0;
	void change(int _a) {b=_a;}
	int getb() {return b;}
    volatile private int value;
    synchronized void put(int i)                       
	{
		value = value + i; 
		System.out.println("存入"+i+", 账上金额为:"+value);
	}
}
class  Save implements Runnable            
{
	//int a=2000;
    private Account a1;     
    public Save(Account a1)
    {
        this.a1 = a1;
    }
    public void run()
    {
    	while(a1.getb()==0) {
        	try {
				Thread.sleep(900);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			a1.put(1);			
	    }
    	System.out.println("10秒已到,停止存钱。stop!");
    }
}
class Fetch implements Runnable            
{
	//int a=20;
    private Account a1;
    public Fetch(Account a1)
    {this.a1 = a1 ;}
    public void run()
    {    
    	if(a1.getb()==0) {
    	try {
		Thread.sleep(9000);
    	} catch (InterruptedException e) {}
    	}
    	a1.change(1);	
    }
}
public class Test{
	public static void main(String[] args){
       Account a1 = new Account();
       new Thread(new Save(a1)).start(); 
       new Thread(new Fetch(a1)).start();
	}
}

1.volatile关键字有什么用?
用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。
2.编写Java程序模拟烧水泡茶最优工序。

public class Test{

    public static void main(String[] args) {
        MyRunnable3 myRunnable3=new MyRunnable3();
        MyRunnable4 myRunnable4=new MyRunnable4();
        Thread t1=new Thread (myRunnable3);
        Thread t2=new Thread (myRunnable4);
        t1.setName("烧水");
        t2.setName("洗杯子");
        t1.start();
        t2.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            //等待烧水完成
            e.printStackTrace();
        }
        try {
            t2.join();
        } catch (InterruptedException e) {
            // 等待洗杯子完成
            e.printStackTrace();
        }
        System.out.println("泡茶....");
    }
}
class MyRunnable3 implements Runnable{
    public void run(){
        System.out.println("烧开水去....");
        try {
            Thread.sleep(5000); //每运行一次,休眠一秒钟
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("烧完了.......");
    }
}
class MyRunnable4 implements Runnable{
    public void run(){
        for(int i=1;i<10;i++){
            System.out.println("洗 "+i+"杯子去....");
            try {
                Thread.sleep(1000); //每运行一次,休眠一秒钟
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值