一.简单的思路为:生产者+消费者模式来实现

1.重写这个对象的触摸事件(对触摸事件与事件分发机制的同学不了解的可以查阅其他资料)

2.在MotionEvent.ACTION_DOWN:事件中启动一个线程,这个线程类似生产者,它不停的生产想要的事件

这里的事件为了调用的顺序,建议采用队列的方式来缓存,事件对象可任意

3.在MptionEvent.ACTION_UP:事件中取消这个线程,取消线程即停止这个线程,采用置中断标记来停止一个线程

5.从任务队列中取出任务进行执行,类似消费者,代码模式与生产者很类似,具体的思路可参看我的前几编文章,里面有很详细的生产者消费者模式多线程的运用

二.任务请求对象:

package com.example.baize.touchdelegate.producer;import java.util.LinkedList;/**
 * 事件对象
* <p>
* Created by lxb on 2017/3/31.
 */
public class EventRequest<T> {private LinkedList<T> requestQueue = new LinkedList<>();private int count;    // 任务队列请求数public EventRequest() {this.count = 0;}public synchronized void buildEvent(T request) throws InterruptedException {while (!requestQueue.isEmpty() && count >= requestQueue.size()) {wait();}System.out.println(Thread.currentThread().getName() + "正在产生" + request + "到请求队列中");requestQueue.addLast(request);count++;notifyAll();}public synchronized T sendEvent() throws InterruptedException {while (count <= 0) {wait();}T request = requestQueue.pop();count--;notifyAll();System.out.println(Thread.currentThread().getName() + "已经成功从请求队列中拿到" + request);return request;}
}

三.生产者线程:

package com.example.baize.touchdelegate.producer;/**
 * 生产游戏手柄的按键事件,本线程通过打断与启动标志来停止线程
* <p>
* Created by lxb on 2017/3/31.
 */
public class ProduceEventThread<T> extends Thread {private EventRequest<T> eventRequest;private volatile boolean terminated = false; // 停止请求标志private T type;       //事件请求类型public ProduceEventThread(T type, EventRequest<T> eventRequest) {this.eventRequest = eventRequest;this.type = type;}public void run() {while (!terminated) {try {this.eventRequest.buildEvent(type);} catch (InterruptedException e) {terminated = true;}}}public void cancel(){terminated = true;interrupt();}}

四.消费者线程:

package com.example.baize.touchdelegate.producer;/**
 * 发送游戏手柄事件的线程,类似消费者
*
 * Created by lxb on 2017/3/31.
 */
public class SendEventThread<T> extends Thread {private EventRequest<T> eventRequest;private volatile boolean terminated = false; // 停止请求标志private T type;       //事件请求类型public SendEventThread(T type, EventRequest<T> eventRequest) {this.eventRequest = eventRequest;this.type = type;}public void run() {while (!terminated) {try {this.eventRequest.sendEvent();} catch (InterruptedException e) {terminated = true;}}}public void cancel(){terminated = true;interrupt();}
}

五。整个触摸对象的触摸事件代理类:

package com.example.baize.touchdelegate;import android.view.MotionEvent;
import android.view.View;import com.example.baize.touchdelegate.producer.EventRequest;
import com.example.baize.touchdelegate.producer.ProduceEventThread;
import com.example.baize.touchdelegate.producer.SendEventThread;/**
 * 游戏手柄按键不停的产生事件,由此类进行代理并采用生产者消费者模式实现
* <p>
* Created by lxb on 2017/3/31.
 */
public class TouchEventDelegate<T> implements View.OnTouchListener {private T type ;private ProduceEventThread<T> produceEventThread;private SendEventThread<T> sendEventThread;private EventRequest<T> eventRequest;public TouchEventDelegate(T type) {this.type = type;eventRequest = new EventRequest<>();}@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:startThreads();break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:stopAllThreads();break;}return true;}private void startThreads() {produceEventThread = new ProduceEventThread<>(type, eventRequest);sendEventThread = new SendEventThread<>(type, eventRequest);produceEventThread.start();sendEventThread.start();}private void stopAllThreads() {if (produceEventThread != null) {produceEventThread.cancel();produceEventThread = null;}if (sendEventThread != null) {sendEventThread.cancel();sendEventThread = null;}}
}

调用方式:

package com.example.baize.activity;import android.content.res.Configuration;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.TouchDelegate;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;import com.example.baize.R;
import com.example.baize.touchdelegate.TouchEventDelegate;
import com.example.baize.utils.VibrateUtils;/**
 * 游戏手柄
* Created by lxb on 2017/3/31.
 */
public class GameCtrlActivity extends BaseActivity{private ImageView mBack;private ImageView mLeft;private ImageView mRight;private ImageView mUp;private ImageView mDown;private ImageView mFun1;private ImageView mFun2;private ImageView mFun3;private ImageView mFun4;private ImageView mFun5;private ImageView mX;private ImageView mY;private ImageView mA;private ImageView mB;private static final Integer leftTouch = 101;private static final Integer upTouch = 102;private static final Integer rightTouch = 103;private static final Integer downTouch = 104;private static final String xTouch = "X";private static final String yTouch = "Y";private static final String aTouch = "A";private static final String bTouch = "B";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_game_ctrl);initView();}@Overrideprotected void setStatusBar() {}private void initView(){EventClick click = new EventClick();mBack = getView(R.id.gc_back);mLeft = getView(R.id.gc_left);mRight = getView(R.id.gc_right);mUp = getView(R.id.gc_up);mDown = getView(R.id.gc_down);mFun1 = getView(R.id.gc_fun1);mFun2 = getView(R.id.gc_fun2);mFun3 = getView(R.id.gc_fun3);mFun4 = getView(R.id.gc_fun4);mFun5 = getView(R.id.gc_fun5);mX = getView(R.id.gc_x);mY = getView(R.id.gc_y);mA = getView(R.id.gc_a);mB = getView(R.id.gc_b);mBack.setOnClickListener(click);/*mLeft.setOnClickListener(click);mRight.setOnClickListener(click);mUp.setOnClickListener(click);mDown.setOnClickListener(click);*/mFun1.setOnClickListener(click);mFun2.setOnClickListener(click);mFun3.setOnClickListener(click);mFun4.setOnClickListener(click);mFun5.setOnClickListener(click);/* mX.setOnClickListener(click);mY.setOnClickListener(click);mA.setOnClickListener(click);mB.setOnClickListener(click);*/mLeft.setOnTouchListener(new TouchEventDelegate<>(leftTouch));mUp.setOnTouchListener(new TouchEventDelegate<>(upTouch));mRight.setOnTouchListener(new TouchEventDelegate<>(rightTouch));mDown.setOnTouchListener(new TouchEventDelegate<>(downTouch));mX.setOnTouchListener(new TouchEventDelegate<>(xTouch));mY.setOnTouchListener(new TouchEventDelegate<>(yTouch));mA.setOnTouchListener(new TouchEventDelegate<>(aTouch));mB.setOnTouchListener(new TouchEventDelegate<>(bTouch));}private class EventClick implements View.OnClickListener{@Overridepublic void onClick(View v) {VibrateUtils.vSimple(GameCtrlActivity.this, 100);switch(v.getId()){case R.id.gc_back:GameCtrlActivity.this.finish();break;case R.id.gc_fun1:case R.id.gc_fun2:case R.id.gc_fun3:case R.id.gc_fun4:case R.id.gc_fun5:Toast.makeText(GameCtrlActivity.this,"未定义",Toast.LENGTH_SHORT).show();break;}}}}

测试结果:

04-01 09:11:16.727 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.727 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.728 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.728 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.728 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.728 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.728 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.728 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.729 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.729 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.729 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.729 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.729 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.729 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.729 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.730 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.730 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.730 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.730 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.730 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.730 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.730 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.731 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.731 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.731 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.731 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.731 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.731 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.731 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.732 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.732 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.732 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.732 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.732 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.733 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.733 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中
04-01 09:11:16.733 20460-21434/com.example.baize I/System.out: Thread-6183已经成功从请求队列中拿到X
04-01 09:11:16.740 20460-21433/com.example.baize I/System.out: Thread-6182正在产生X到请求队列中

转载于:https://www.cnblogs.com/Awangzhen/p/8922183.html

生产者消费者模型 android相关推荐

  1. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

  2. 生产者/消费者模型详解(基于Java)

    title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...

  3. python 生产消费者_python之生产者消费者模型实现详解

    代码及注释如下 #Auther Bob #--*--conding:utf-8 --*-- #生产者消费者模型,这里的例子是这样的,有一个厨师在做包子,有一个顾客在吃包子,有一个服务员在储存包子,这个 ...

  4. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  5. 进程 互斥锁、队列与管道、生产者消费者模型

    目录 1.互斥锁 2.队列与管道 3.生产者消费者模型(Queue) 4.生产者消费者模型(JoinableQueue) 1.互斥锁 首先导入Lock模块 实例化一把锁 但是每次生成子进程的时候都会重 ...

  6. 11.python并发入门(part8 基于线程队列实现生产者消费者模型)

    一.什么是生产者消费者模型? 生产者就是生产数据的线程,消费者指的就是消费数据的线程. 在多线程开发过程中,生产者的速度比消费者的速度快,那么生产者就必须等待消费者把数据处理完,生产者才会产生新的数据 ...

  7. 线程同步之经典生产者-消费者模型

    /* 线程同步之生产者-消费者模型 该模型符合以下要求: 1.生产者只在仓储未满时生产,仓满则停止生产: 2.消费者只在仓储未空时消费,仓空则等待: 3.当消费者发现仓储为空时则通知生产者生产: 4. ...

  8. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型...

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  9. C++编程模拟生产者消费者模型

    生产者消费者问题是操作系统中典型的进程同步互斥问题,(英语:Producer-Consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

最新文章

  1. word2vec_文本相似度
  2. 最简单的Evernote,最专业的活用方法 by 电脑玩物站长
  3. 电子支付公司Nuvei支持BTC等近40种加密货币
  4. Python实现爬取豆瓣电影|python豆瓣全栈爬虫:电影系列全爬虫系统1.0:(信息,短评,影评,海报)|你想爬的都有
  5. Illumina联手IBM Watson Health解读癌症基因谱
  6. '' and 'and' difference in python
  7. LIRe 源代码分析 3:基本接口(ImageSearcher)
  8. BZOJ1878 [SDOI2009]HH的项链
  9. Qt_QTableWidget用法 添加、删除、添加控件、获取控件在表格中位置
  10. gentoo linux软件安装,Gentoo Linux 快速安装方法安装
  11. 百度地图汽车物流数智化应用方案,推进整车运输行业全链条数字化发展
  12. 计算机的码片是指什么作用,计算机通信作业共有四个站进行码分多址的CDMA通信4个站的码片 爱问知识人...
  13. 小猿学python_小猿圈详解小白如何学习Python网络爬虫
  14. KVM虚拟机支持虚拟化(kvm虚拟化嵌套)
  15. j2ee开发的各种技术
  16. SpringBoot应用WebSocket实现在线聊天
  17. 阿里云邮箱登录日志中有异地IP登录是怎么回事?该怎么办?
  18. 陈岷愿做中华的守护者
  19. 二维数组实现n阶方阵
  20. lol服务器维护2021,lol维护几点结束 2021英雄联盟维护最新公告

热门文章

  1. 【人工智能】3.谓词与机器推理
  2. 4.19 数椟科技远程面试 + 粉笔
  3. ssm框架前后端数据交互完整示例
  4. 什么是计算机的多用户,操作系统多用户是什么意思
  5. 1.稀缺数组java实现
  6. nginx的DR模式
  7. 介绍120 个相见恨晚的神器网站--学习、搜索、图片、视频样样不少!
  8. PDPS软件:机器人焊枪工具自动选取功能介绍与使用方法
  9. Zxing 预览框不变增加扫描区域,仿微信扫到一半就可以成功
  10. tidefinger(指纹识别)