Java线程同步Condition替代wait-notify

本文深入探讨了Java中使用Condition替代传统wait-notify方法进行线程同步的技巧。通过具体实例代码展示了如何利用Condition实现更精细的线程间通信,包括等待、唤醒操作的实现方式,为读者提供了理解和运用Condition机制的实用指南。

Java线程同步Condition替代wait-notify

package zhangphil.demo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

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

public class MainActivity extends AppCompatActivity {
    private boolean flag = false;

    private Lock mLock = new ReentrantLock();
    private Condition mCondition = mLock.newCondition();

    //等待,加锁。
    private void await() throws Exception {
        mLock.lock();
        
        try {
            mCondition.await();
        } finally {
            mLock.unlock();
        }
    }

    //发送信号,解锁。
    private void signal() {
        mLock.lock();
        try {
            mCondition.signalAll();//或者 mCondition.signal();
        } finally {
            mLock.unlock();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.change_flag).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                flag = !flag;
                System.out.println(flag + "");
            }
        });

        findViewById(R.id.notify_all).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                notify_all();
            }
        });

        t();
    }

    private void t() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    System.out.println(Thread.currentThread().getId() + "-" + System.currentTimeMillis());

                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    if (flag) {
                        try {
                            await();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();
    }

    private void notify_all() {
        signal();
    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhangphil

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

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

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

打赏作者

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

抵扣说明:

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

余额充值