通过线程锁+List实现多线程阻塞式通讯

通过线程锁+List实现多线程阻塞式通讯



注意下面
如果有车载讨论需要的小伙伴,可以私信加我微信,拉你进群,和同行业大佬交流
注意上面

前言

昨天和大大佬沟通学习了安卓ArrayBlockingQueue队列的阻塞式实现,今天基于List和线程锁多线程阻塞式通讯(免不了向大大佬咨询)


提示:以下是本篇文章正文内容,下面案例可供参考

一、原子性和可见性

参照链接:原子性和可见性,我自己的理解就是,多线程不能同时访问同一个资源,要一个顺序去执行这个逻辑,并且其中只能有一个线程同时对资源进行访问,线程锁的作用就是限制除当前线程以外的其他线程对资源的访问

二、实际代码

代码如下(示例):

package com.example.mylistobject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String Tag = "mylistobject";
    private MyInfo myinfo;
    private MyInfo recvinfo;
    private Object lock = new Object();
    List<MyInfo> mlist = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getlist();
        setlist();

    }

    private void setlist(){
        new Thread(){
            @Override
            public void run() {
                for(int i=0;i < 10;i++){
                    myinfo = new MyInfo();
                    myinfo.setID(i);
                    myinfo.setdata(Integer.toString(i));
                    synchronized (mlist){		
                        mlist.add(myinfo);
                        Log.e(Tag,"set:"+myinfo.data);
                        try {
                            mlist.notify();			//mlist通知启动
                        }catch (Exception e){

                        }
                    }
                    synchronized (lock){
                        try {
                            lock.wait();			//lock通知等待
                        }catch (Exception e){}
                    }
                }
            }
        }.start();
    }

    private void getlist(){
        new Thread(){
            @Override
            public void run() {
                while (true){
                    synchronized (mlist){
                        try {
                            mlist.wait();		//mlist通知等待
                        }catch (Exception e){}
                        recvinfo = mlist.get(0);
                        mlist.remove(0);
                        Log.e(Tag,"get:"+recvinfo.data);
                    }
                    synchronized (lock){
                        try {
                            lock.notify();		//lock通知启动
                        }catch (Exception e){}
                    }
                }
            }
        }.start();
    }

    static class MyInfo {

        private int ID;

        private String data;

        public int setID(int ID){
            return this.ID = ID;
        }

        public String setdata(String data){
            return  this.data = data;
        }

    }
}


写在结尾

我是一名车载集成测试开发工程师,希望能和志同道合的朋友一起相互学习进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值