第一题:两个线程,一个线程打印1-52,另一个打印A-Z,打印顺序为12A34B56C....5152Z.第二题:3个车位的停车场,模拟实现多个车子同时进出的情景.

这篇博客探讨了两个多线程编程问题:一是如何实现两个线程交替打印数字1-52和字母A-Z;二是模拟一个3车位停车场的运行,模拟车辆的进出。通过使用Java的`synchronized`关键字和`wait()`、`notify()`方法,实现了线程间的同步与通信,确保了打印顺序和停车场车位的有效管理。
摘要由CSDN通过智能技术生成
/*
第一题:两个线程,一个线程打印1-52,另一个打印A-Z,打印顺序为12A34B56C....5152Z.
 */
public class PrintTwo {
    public static void main(String[] args) {
        Print print = new Print();
        IntThread intThread = new IntThread(print);
        LetterThread letterThread = new LetterThread(print);
        intThread.start();
        letterThread.start();
    }
}

//打印整数线程
class IntThread extends Thread {
    private Print print;

    //构造方法
    public IntThread(Print print) {
        this.print = print;
    }

    //调用打印机打印数字的方法
    @Override
    public void run() {
        print.printInt();
    }
}

//打印字母线程
class LetterThread extends Thread {
    private Print print;

    //构造方法
    public LetterThread(Print print) {
        this.print = print;
    }

    //调用打印机打印字母的线程
    @Override
    public void run() {
        print.printLetter();
    }
}

//定义打印机类,提供打印字母和数字的方法
class Print {
    //切换标识
    private boolean flag = true;

    public synchronized void printInt() {
        int i = 1;
        //一直循环打印,知道打印完数字52
        while (i < 53) {
            //线程刚开始进来不会等待
            if (!flag) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //线程刚开始进来不会等待先执行此处
            } else {
                //每打印两个数字就转换标识,唤醒打印字母的线程打印
                System.out.print(i);
                i++;
                if ((i - 1) % 2 == 0) {
                    flag = false;
                    notify();
                }
            }
        }
    }

    public synchronized void printLetter() {
        char i = 'A';
        //一直循环打印,知道打印完字母Z
        while (i <= 'Z') {
            //线程进来就等待
            if (flag) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                //每打印1个字母就转换标识,唤醒打印数字的线程打印
                System.out.print(i);
                i++;
                flag = true;
                notify();
            }
        }
    }
}
/*
第二题:3个车位的停车场,模拟实现多个车子同时进出的情景.
将停车场看做一个工厂,停车场是共享资源,需要对停车场加监视器,
停车是生产,车子开走是消费,车位满了等待车子开走,车子全开走了就等待停车.
 */
class Test {
    public static void main(String[] args) {
        Park pk = new Park();
        Thread t1 = new Thread(new CarInThread(pk));
        Thread t2 = new Thread(new CarOutThread(pk));
        t1.start();
        t2.start();
    }
}

public class Park {
    //定义3个停车位
    private int states = 3;

    public synchronized void carIn(int i) {
        if (states == 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println(i + "号车已停车!");
            System.out.println("还剩" + --states + "个车位");
            notifyAll();
        }
    }

    public synchronized void carOut(int i) {
        if (states == 3) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println(i + "号车已经驶离!");
            System.out.println("还剩" + (++states) + "个车位");
            notifyAll();
        }
    }
}
//停车线程
class CarInThread implements Runnable {
    Park pk;

    public CarInThread(Park pk) {
        this.pk = pk;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 20; i++) {
            pk.carIn(i);
        }
    }
}
//车子驶离线程
class CarOutThread implements Runnable {
    Park pk;

    public CarOutThread(Park pk) {
        this.pk = pk;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 20; i++) {
            //睡眠一下,代表停车间隔,车子出去之后立马会有车子停进来
            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            pk.carOut(i);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值