线程间通信
Posted bug01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程间通信相关的知识,希望对你有一定的参考价值。
目前有个项目,需要多个线程共用一个单例里面的发送数据方法。且这个方法入口每次只能一个一个线程进入。
所以写了一个方法,功能是创建单一的线程,使用队列方法放入数据进行处理。
测试多个线程发送数据
public class Test { private Handler sendHandler; public Test(){ // 开启接收线程 new Thread(new SendRunnable()).start(); } /** * 将消息放入队列 * @param message */ public synchronized void sendMessage(String message){ if (sendHandler==null){ return; } Looper looper = Looper.myLooper(); Message msg = sendHandler.obtainMessage(); msg.obj = message; sendHandler.sendMessage(msg); }
/** * 独立线程,用于接收队列中要发送的消息。并且排队处理 */ class SendRunnable implements Runnable { @Override public void run() { String msg; Looper.prepare(); sendHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(@NonNull Message msg) { { System.out.println("收到消息:"+ msg.obj); System.out.println("模拟处理消息过程..." ); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("完成消息处理" ); return false; } } }); Looper.loop(); } } }
测试如下方法:
Test test = new Test();
/** * 模拟多线程并发,发送消息 */ public void beginTest(){ new Thread(new Runnable() { @Override public void run() { final AtomicInteger atomicInteger = new AtomicInteger(); for (int i =0 ;i <20; i ++){ new Thread(new Runnable() { @Override public void run() { test.sendMessage("ving:" + atomicInteger.getAndIncrement()); } }).start(); } } }).start(); }
调用方法,开始测试:
beginTest();
以上是关于线程间通信的主要内容,如果未能解决你的问题,请参考以下文章