多线程交替打印奇偶数

使用synchronized和wait()、notify()实现

public class OddEvenprint {
    private static volatile Integer number = 1;
    private  Object ob = new Object();
    class Odd implements Runnable{
        @Override
        public void run() {
            while (number<100){
                synchronized (ob){
                    System.out.println("奇数"+number);
                    number++;
                    ob.notify();
                    try {
                        if (number<100) {
                            ob.wait();
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    class Even implements Runnable{

        @Override
        public void run() {
            while (number<=100){
                synchronized (ob){
                    System.out.println("偶数"+number);
                    number++;
                    ob.notify();
                    try {
                        if (number<=100) {
                            ob.wait();
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        OddEvenprint oddEvenprint = new OddEvenprint();
        Odd odd = oddEvenprint.new Odd();
        Even even = oddEvenprint.new Even();
        new Thread(odd).start();
        new Thread(even).start();

    }
}

下面这个代码是别人写的:
(找不到是看谁的了)

public class PrintSD {

    //定义打印的方法
    public synchronized void print(String str,int num){
        notify();
        System.out.println(str+num);
        try {
            if(100 != num){
                wait();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //奇数打印线程
    class Odd implements Runnable{
        @Override
        public void run() {
            for(int i=1;i<100;i+=2){
                print("奇数:",i);
            }
        }
    }

    //偶数打印线程
    class Even implements Runnable{
        @Override
        public void run() {
            for(int i=2;i<=100;i+=2){
                print("偶数:",i);
            }
        }
    }

    public static void main(String[] args) {
        PrintSD p = new PrintSD();
        Odd odd = p.new Odd();
        Even even = p.new Even();
        new Thread(odd).start();
        new Thread(even).start();
        System.out.println("我结束了");

    }
}

使用Lock实现

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class OddEvenPrintByLock {
    private static volatile Integer number = 0;
    Lock lock = new ReentrantLock();
    Condition oddCondition = lock.newCondition();
    Condition evenCondition = lock.newCondition();
    class Odd implements Runnable{
        @Override
        public void run() {
            while (number<100){
                try {
                    lock.lock();
                    System.out.println("奇数"+number);
                    number++;
                    evenCondition.signal();
                    if (number<100) {
                        oddCondition.await();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            }
        }
    }
    class Even implements Runnable{
        @Override
        public void run() {
            while (number<=100){
                try {
                    lock.lock();
                    System.out.println("偶数"+number);
                    number++;
                    oddCondition.signal();
                    if (number<=100) {
                        evenCondition.await();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            }
        }
    }

    public static void main(String[] args) {
        OddEvenPrintByLock print = new OddEvenPrintByLock();
        Even even = print.new Even();
        Odd odd = print.new Odd();
        new Thread(even).start();
        new Thread(odd).start();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值