开启两个线程A、B,打印1到10,线程A打印奇数(1、3、5、7、9),线程B打印偶数(2、4、6、8、10)

三种解题方法:

1

package com.dume.server.face;


/**
 * 开启两个线程A、B,打印1到10,线程A打印奇数(1、3、5、7、9),线程B打印偶数(2、4、6、8、10)。
 */
public class ThreadA implements Runnable{
    //最大数
    private int max;
    //打印方法的类
    private Printer printer;
    //是否偶数
    private boolean isEventNumber;

    public ThreadA(int max, Printer printer, boolean isEventNumber) {
        this.max = max;
        this.printer = printer;
        this.isEventNumber = isEventNumber;
    }

    @Override
    public void run() {

        //如果是偶数为2,不是则1
        int number = isEventNumber ? 2:1;
        //直到小于等于10不成立
        while(number<=max){
            if(isEventNumber){
                //打印偶数
                printer.printEvent(number);
            }else{
                //打印奇数
                printer.printOdd(number);
            }
            //自增2
            number+=2;
        }
    }

    /**
     * 打印方法
     */
    static class Printer {

        private volatile boolean isOdd;


        //同步代码块
        synchronized void printEvent(int number){
            //偶数时
            while (!isOdd){
                try{
                    //暂停线程,释放对象锁
                    wait();
                }catch (InterruptedException e){
                    Thread.currentThread().interrupt();
                }

            }
            //打印该奇数
            System.out.println(Thread.currentThread().getName()+":"+number);

            isOdd=false;
            //继续执行
            notify();
        }

        synchronized void printOdd(int number){
            //如果是奇数
            while (isOdd){
                try{
                    //暂停线程,释放对象锁
                    wait();
                }catch (InterruptedException e){
                    Thread.currentThread().interrupt();
                }

            }
            //打印该奇数
            System.out.println(Thread.currentThread().getName()+":"+number);
            //设置共享变量为奇数类型
            isOdd=true;
            //继续执行
            notify();
        }
    }


    public static void main(String[] args){
        Printer printer = new Printer();
        new Thread(new ThreadA(10,printer,false),"奇数").start();
        new Thread(new ThreadA(10,printer,true),"偶数").start();

    }



}

2

package com.dume.server.face;
//开启两个线程A、B,打印1到10,线程A打印奇数(1、3、5、7、9),线程B打印偶数(2、4、6、8、10)。
import java.util.concurrent.locks.LockSupport;

/**
 * 线程1和2交替输出
 */
public class ThreadB {

    static Thread thread1;
    static Thread thread2;


    public static void main(String[] args) {
        thread1 = new Thread(()->{
    		    for(int i=1;i<=9;i+=2){
                    System.out.println(Thread.currentThread().getName()+"--"+"奇数:"+i);
                    //释放线程2
                    LockSupport.unpark(thread2);
                    //锁住当前线程1
                    LockSupport.park();
                }
            },"线程1");

        thread2 = new Thread(()->{
            for(int i=2;i<=10;i+=2){
                //锁住线程2
                LockSupport.park();
                System.out.println(Thread.currentThread().getName()+"--"+"偶数:"+i);
                //释放线程1
                LockSupport.unpark(thread1);

            }
        },"线程2");

        thread1.start();
        thread2.start();
    	}
}

3

package com.dume.server.face;

//开启两个线程A、B,打印1到10,线程A打印奇数(1、3、5、7、9),线程B打印偶数(2、4、6、8、10)。

import java.util.concurrent.locks.LockSupport;

/**
 * 按照顺序执行
 */
public class ThreadC {

    static Thread thread1;
    static Thread thread2;

    public static void main(String[] args){

        thread1 = new Thread(()->{
            for(int i=1;i<10;i+=2){

                //阻塞线程1
                LockSupport.park();
                System.out.println(Thread.currentThread().getName()+"--"+"奇数:"+i);
                //开始线程2
                LockSupport.unpark(thread2);
        }
        },"线程1");

        thread2 = new Thread(()->{
            for(int i=2;i<=10;i+=2){
                //开始线程2
                LockSupport.unpark(thread1);
                //阻塞线程2
                LockSupport.park();
                System.out.println(Thread.currentThread().getName()+"--"+"偶数:"+i);
            }
        },"线程2");

        thread1.start();
        thread2.start();
    }




}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小七蒙恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值