有关多线程的手撕代码(Java)

本文详细介绍了Java多线程的实现,包括通过自旋和Condition实现循环输出ABCD,生产者消费者模型,死锁的代码示例以及线程池的创建。同时,给出了面试中常见的两个线程有序输出0-100的问题。
摘要由CSDN通过智能技术生成

1.使用多线程循环输出ABCD

1.1.通过自旋暴力实现

通过线程池(规范禁止显示的创建线程)以及加锁来实现循环输出ABCD。

public class 循环输出ABCD {
   
    //使用java方法获得电脑核心数,用来设置线程池
    static final int core=Runtime.getRuntime().availableProcessors();
    //图方便使用了Fixed方法创建,规范推荐使用ThreadPoolExecutor创建线程池
    private static ExecutorService executors = Executors.newFixedThreadPool(core);
    //输出次数
    private static volatile int times=40;
    public static void main(String[] args) {
   
        //每次操作加锁,防止多线程死锁程序卡死
        final Lock lock= new ReentrantLock();
        executors.execute(()->{
   
            //使用while来循环判断,类似自旋,同时避免虚假唤醒
            while (times>0){
   
                lock.lock();
                //用times判断保证0次退出
                if (times%4==0&&times>0){
   
                    System.out.print("A");
                    times--;
                }
                lock.unlock();
            }
        });
        executors.execute(()->{
   
            while (times>0){
   
                lock.lock();
                if (times%4==3&&times>0){
   
                    System.out.print("B");
                    times--;
                }
                lock.unlock();
            }
        });
        executors.execute(()->{
   
            while (times>0){
   
                lock.lock();
                if (times%4==2&&times>0){
   
                    System.out.print("C");
                    times--;
                }
                lock.unlock();
            }
        });
        executors.execute(()->{
   
            while (times>0){
   
                lock.lock();
                if (times%4==1&&times>0){
   
                    System.out.println("D");
                    times--;
                }
                lock.unlock();
            }
        });
        //最后关闭线程池
        executors.shutdown();
    }
}

运行结果:
在这里插入图片描述

1.2.通过Condition有序执行

public class 循环有序输出ABCD {
   
    //状态量
    private static int state = 1;
    private static final int core = Runtime.getRuntime().availableProcessors();
    //创建一个线程池
    private static ExecutorService executor=Executors.newFixedThreadPool(core);
    public static void main(String[] args) {
   
        Lock lock = new ReentrantLock();
        Condition condition1 = lock.newCondition();
        Condition condition2 = lock.newCondition();
        Condition condition3 = lock.newCondition();
        Condition condition4 = lock.newCondition
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值