• Java第十次作业


    (一)学习总结

    2.多线程龟兔赛跑游戏

    class Tortoise implements Runnable{
    	private int totla=0;
    	private int finalTotla;
    	public Tortoise(int finalTotla){
    		this.finalTotla = finalTotla;
    	}
    	public void run(){
    		while(totla<finalTotla){
    			this.totla++;
    			System.out.println("乌龟跑了"+totla+"步");
    		}
    	}
    }
    class Hare implements Runnable{
    	private int totla=0;
    	private int finalTotla;
    	boolean[] flags = {true,false};
    	public Hare(int finalTotla){
    		this.finalTotla=finalTotla;
    	}
    	public void run(){
    		while(totla<finalTotla){
    			 boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
    			 if(isHareSleep){
    				 System.out.println("兔子睡着了");
    			 }else{
    				 totla+=2;
    				 System.out.println("兔子跑了"+totla+"步");
    			 }
    		}
    	}
    }
    public class TortoiseHareRace  { 
        public static void main(String[] args) {
            Tortoise tortoise = new Tortoise(10);
            Hare hare = new Hare(10);
            Thread tortoiseThread = new Thread(tortoise);
            Thread hareThread = new Thread(hare);
            tortoiseThread.start();
            hareThread.start();
        }
    }
    

    3.原程序运行结果

    生产者开始生产整数......
    消费者开始消耗整数......
    生产者设定 (1)
    生产者设定 (2)
    生产者设定 (3)
    生产者设定 (4)
    生产者设定 (5)
    生产者设定 (6)
    生产者设定 (7)
    生产者设定 (8)
    生产者设定 (9)
    生产者设定 (10)
    消费者取走 (10)
    消费者取走 (10)
    消费者取走 (10)
    消费者取走 (10)
    消费者取走 (10)
    消费者取走 (10)
    消费者取走 (10)
    消费者取走 (10)
    消费者取走 (10)
    

    原因:没有设定代码的同步与等待唤醒

    修改后

    class Consumer implements Runnable {
        private Clerk clerk;
        public Consumer(Clerk clerk) {
            this.clerk = clerk;
        }
        public void run() {
            System.out.println("消费者开始消耗整数......");
            // 消耗10个整数
            for(int i = 1; i <= 10; i++) {
                try {
                     // 等待随机时间
                    Thread.sleep((int) (Math.random() * 3000));
                }
                catch(InterruptedException e) {
                    e.printStackTrace();
                }              
                clerk.getProduct();// 从店员处取走整数
            }
        }
     }
    class Producer implements Runnable {
        private Clerk clerk;
        public Producer(Clerk clerk) {
            this.clerk = clerk;
        }
        public void run() {
            System.out.println( "生产者开始生产整数......");
            // 生产1到10的整数
            for(int product = 1; product <= 10; product++) {
                try {
                    Thread.sleep((int) Math.random() * 3000);
                }
                catch(InterruptedException e) {
                    e.printStackTrace();
                }
               clerk.setProduct(product); // 将产品交给店员
            }
        } 
    }
    public class Demo {
        public static void main(String[] args) {
            Clerk clerk = new Clerk();
            Thread consumerThread = new Thread(new Consumer(clerk)); 
            Thread producerThread = new Thread(new Producer(clerk)); 
            consumerThread.start(); 
            producerThread.start(); 
        }
    }
    class Clerk {
        private int product = -1; // -1 表示目前没有产品
        private int p;
        // 这个方法由生产者呼叫
        public synchronized void setProduct(int product) {
            if (this.product != -1) {
                try {
                    super.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.product = product;
            p = this.product;
            System.out.printf("生产者设定 (%d)%n", this.product);
            getProduct();
            this.product = -1;
            super.notify();
        }
    
        // 这个方法由消费者呼叫
        public synchronized int getProduct() {
            if (this.product == -1) {
                try {
                    super.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.printf("消费者取走 (%d)%n", p);
            this.product = -1;
            super.notify();
            return this.product;
        }
    }
    

    运行结果

    生产者开始生产整数......
    消费者开始消耗整数......
    生产者设定 (1)
    消费者取走 (1)
    生产者设定 (2)
    消费者取走 (2)
    生产者设定 (3)
    消费者取走 (3)
    生产者设定 (4)
    消费者取走 (4)
    生产者设定 (5)
    消费者取走 (5)
    生产者设定 (6)
    消费者取走 (6)
    生产者设定 (7)
    消费者取走 (7)
    生产者设定 (8)
    消费者取走 (8)
    生产者设定 (9)
    消费者取走 (9)
    生产者设定 (10)
    消费者取走 (10)
    

    (二)实验总结

    实验内容:

    1.程序设计思路:创建类实现Runnable接口,创建三个线程

    MyThread mt1 = new MyThread();
    new Thread(mt1).start();
    new Thread(mt1).start();
    new Thread(mt1).start();
    

    2.程序设计思路:创建银行类实现钱的存储,创建用户类实现Runnable接口,创建两个线程

    class Bank{
    	private double balance;
    	public void setBalance(double balance){
    		this.balance+=balance;
    	}
    	public double getBalance(){
    		return this.balance;
    	}
    }
    class Person implements Runnable{
    	Bank bank = new Bank();
    	private double money;
    	public Person(double money){
    		this.money = money;
    	}
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		for(int i=0;i<3;i++){
    			bank.setBalance(this.money);
    			System.out.println("存款成功,当前账户余额为"+bank.getBalance());
    		}
    	}
                public void setMoney(double money){
    		this.money = money;
    	}
    	public double getMoney(){
    		return this.money;
    	}
    }
    

    (三)代码托管

  • 相关阅读:
    并发编程学习笔记(15)----Executor框架的使用
    并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理
    并发编程学习笔记(13)----ConcurrentLinkedQueue(非阻塞队列)和BlockingQueue(阻塞队列)原理
    并发编程学习笔记(12)----Fork/Join框架
    并发编程学习笔记(11)----FutureTask的使用及实现
    并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
    设计模式:代理模式
    设计模式:装饰模式
    设计模式:几大原则
    设计模式:策略模式(Strategy)
  • 原文地址:https://www.cnblogs.com/yamito/p/6936539.html
Copyright © 2020-2023  润新知