通过线程锁+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;
}
}
}
写在结尾
我是一名车载集成测试开发工程师,希望能和志同道合的朋友一起相互学习进步