Java(多线程)

发布于:2024-05-08 ⋅ 阅读:(31) ⋅ 点赞:(0)

取水:

主部分:

package a0506.Test3;

import java.util.Random;

public class Test3 {
    public static void main(String[] args) {
        Well2 well2=new Well2(10);
        WellThread Zs=new WellThread("------张三------",well2,new Random().nextInt(5));
        WellThread Ls=new WellThread("------李四------",well2,new Random().nextInt(6));
        WellThread Ww=new WellThread("------王五------",well2,new Random().nextInt(8));
        WellThread Tt=new WellThread("------桃桃------",well2,new Random().nextInt(3));
        Zs.start();
        Ls.start();
        Ww.start();
        Tt.start();
        try {
            Ls.join();//当前线程main要等待Ls线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)
            Zs.join();//当前线程main要等待Zs线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)
            Ww.join();//当前线程main要等待Ww线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)
            Tt.join();//当前线程main要等待Tt线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("剩余水量: "+well2.getWaterSize());
    }
}

水井:

package a0506.Test3;

import java.util.concurrent.locks.ReentrantLock;

public class Well2 {
    private int waterSize;
    private final ReentrantLock lock=new ReentrantLock();

    public Well2(int waterSize) {
        this.waterSize = waterSize;
    }
    public void fetchWater(int number){
        lock.lock();
        try {
            if (number > this.waterSize) {
                System.out.println("剩余水量: " + this.waterSize + ",不能供应: " + number + Thread.currentThread().getName() + "没有水喝");
            } else {
                System.out.println(Thread.currentThread().getName() + "取走水量:" + number);
                this.waterSize -= number;
                System.out.println("剩余水量: " + this.waterSize);
            }
        }finally{
            lock.unlock();
            }
    }
    public int getWaterSize(){
        return this.waterSize;
    }
}

取水线程:

package a0506.Test3;

public class WellThread extends Thread{
    private Well2 well;
    private int number;

    public WellThread(String name, Well2 well, int number) {
        super(name);
        this.well = well;
        this.number = number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public int getSize(){
        return this.well.getWaterSize();
    }

    @Override
    public void run() {
        this.well.fetchWater(number);
    }
}

 理解:

感觉之前写的代码并没有很好的体现面向对象这个问题;

先分析一下这个代码:

分了三个类,水井类有水量,还有一个方法(传入一个参数要取多少水)用来反应取水的情况(实际来看水井确实只需要知道一个水量就可以了,可以反应剩下多少水等等)取水的线程类有线程名字(谁取水)取水量(取多少水),水井(在哪个水井取水)然后run()方法里面就可以写去这个水井里面去取水

感觉这个思路就很清晰,感觉自己之前写的代码一点逻辑都没有糊上去的。以后多加改正