java实现两个线程交替打印1到100

多线程基础案例

1.单纯从两个线程交替的角度考虑。

public class testThread {

    public static void main(String[] args) {
        PrintNum printNum = new PrintNum();

        new Thread(() -> {
            printNum.printNum();
        }, "线程1").start();

        new Thread(() -> {
            printNum.printNum();
        }, "线程2").start();
    }
}

class PrintNum {
    int number = 1;
    Lock lock = new ReentrantLock();
    Condition c = lock.newCondition();

    public void printNum() {
        while (number <= 100) {
            lock.lock();
            try {
                c.signal();
                System.out.println(Thread.currentThread().getName() + ":" + number);
                number++;
                c.await();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
}

2.从一个线程打印奇数,一个线程打印偶数的角度考虑。

public class testThread {

    public static void main(String[] args) {
        PrintNum printNum = new PrintNum1();

        new Thread(() -> {
            printNum.printSingle();
        }, "线程1(单)").start();

        new Thread(() -> {
            printNum.printDouble();
        }, "线程2(双)").start();
    }
}

class PrintNum {
    int number = 1;

    Lock lock = new ReentrantLock();
    Condition c1 = lock.newCondition();
    Condition c2 = lock.newCondition();

    public void printSingle() {
        while (number < 100) {
            lock.lock();
            try {
                while (number%2 != 1) {
                    c1.await();
                }
                System.out.println(Thread.currentThread().getName() + ":" + number);
                number++;
                c2.signal();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }

    public void printDouble() {
        while (number < 100) {
            lock.lock();
            try {
                while (number%2 != 0) {
                    c2.await();
                }
                System.out.println(Thread.currentThread().getName() + ":" + number);
                number++;
                c1.signal();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
}

版权声明:本文为wwwhcs原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。