java 两个线程间隔打印1,2一共100次的骚操作

package com.pycat.sample.print;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * Created by cat on 2018/6/26.
 * print number
 * --- split print number 1,2 in two different thread
 */
public class PrintNumber {


    private final ReentrantReadWriteLock.WriteLock mLock;
    private final Condition condition1;
    private final Condition condition2;

    public PrintNumber() {
        this.mLock = new ReentrantReadWriteLock().writeLock();
        condition1 = mLock.newCondition();
        condition2 = mLock.newCondition();
    }

    private AtomicInteger count = new AtomicInteger(0);

    public void print1() {

        while (count.get() < 100) {
            try {
                mLock.lock();
                System.out.println(Thread.currentThread().getName() + ":" + 1 + "   " + count);
                count.set(count.get() + 1);
                condition2.signalAll();
                condition1.await();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                mLock.unlock();
            }
        }
        System.out.println("end PRINT 111111111111111111111");
        mLock.lock();
        condition2.signalAll();
        condition1.signalAll();
        mLock.unlock();
    }

    public void print2() {

        while (count.get() < 100) {
            try {
                mLock.lock();
                System.out.println(Thread.currentThread().getName() + ":" + 2 + "  xxx " + count);
                count.set(count.get() + 1);
                condition1.signalAll();
                condition2.await();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                mLock.unlock();
            }
        }
        System.out.println("end PRINT 222222222222222222222222");
        mLock.lock();
        condition1.signalAll();
        condition2.signalAll();
        mLock.unlock();
    }

}

调用:

package com.pycat.sample;

import com.pycat.sample.print.PrintNumber;

public class Main {

    public static void main(String[] args) {
        // write your code here
        System.out.println("hello world");

        PrintNumber number = new PrintNumber();
        new Thread(number::print1).start();
        new Thread(number::print2).start();
    }

}

大体实现就是这样吧,反正思路就是:1打印了一次后,立即唤醒2,并让自己等待;2和1逻辑相同。

然后需要注意一个细节就是最后,100次到了,不需要任何线程等待了,就把等待全部设置成唤醒。否则会导致程序一直不结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值