消息类(Message):
package p;
public class Message {
private Runnable runnable;
private long start;
private long delay;
public Message(Runnable runnable, long delay) {
start = System.currentTimeMillis();
this.runnable = runnable;
this.delay = delay;
}
public void handle() {
runnable.run();
}
public boolean canHandle() {
return delay <= System.currentTimeMillis() - start;
}
}
消息队列(MessageQueue):
package p;
import java.util.ArrayList;
import java.util.List;
public class MessageQueue {
private List<Message> messages = new ArrayList<Message>();
private int cursor = -1;
/**
* 入队
*
* @param message
*/
public void push(Message message) {
messages.add(message);
}
/**
* 移出队列
*
* @param message
*/
public void remove(Message message) {
messages.remove(message);
cursor--;
}
/**
* 出队
*
* @return
*/
public Message pop() {
Message message = null;
if (!messages.isEmpty()) {
message = messages.get(++cursor);
if (cursor == messages.size() - 1) {
cursor = -1;
}
}
return message;
}
}
每个线程拥有一个消息队列。
消息管理类(MessageManager):
package p;
public class MessageManager {
private static ThreadLocal<MessageQueue> local = new ThreadLocal<MessageQueue>();
/**
* 消息入队
* @param message
*/
public static void addMessage(Message message) {
local.get().push(message);
}
/**
* 创建消息队列
*/
public static void prepare() {
MessageQueue queue = local.get();
if (queue != null) {
throw new RuntimeException("每个线程只能有一个消息队列!");
}
local.set(new MessageQueue());
}
/**
* 开启消息循环
*/
public static void loop() {
MessageQueue messageQueue = local.get();
Message message;
while ((message = messageQueue.pop()) != null) {
if (message.canHandle()) {
messageQueue.remove(message);
message.handle();
}
}
}
}
模拟handler类(Handler):
package p;
public class Handler {
public void post(Runnable runnable, long delay) {
Message message = new Message(runnable, delay);
MessageManager.addMessage(message);
}
}
模拟activity的类(MainUI):
package p;
public class MainUI {
public void onCreate() {
System.out.println("onCreate:" + Thread.currentThread().getName());
new Handler().post(new Runnable() {
@Override
public void run() {
System.out.println("post after 3 minutes:"
+ Thread.currentThread().getName());
}
}, 3000);
new Handler().post(new Runnable() {
@Override
public void run() {
System.out.println("post after 6 minutes:"
+ Thread.currentThread().getName());
}
}, 6000);
new Thread(new Runnable() {
@Override
public void run() {
MessageManager.prepare();
new Handler().post(new Runnable() {
@Override
public void run() {
System.out.println("post after 9 minutes:"
+ Thread.currentThread().getName());
}
}, 9000);
new Handler().post(new Runnable() {
@Override
public void run() {
System.out.println("post after 12 minutes:"
+ Thread.currentThread().getName());
}
}, 12000);
MessageManager.loop();
}
}).start();
System.out.println("End onCreate!");
}
}
模拟android启动activity的类(Main):
package p;
public class Main {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
MessageManager.prepare();
MainUI mainUI = new MainUI();
mainUI.onCreate();
MessageManager.loop();
}
};
Thread main = new Thread(runnable);
main.setName("main");
main.start();
}
}
执行输出:
onCreate:main
End onCreate!
post after 3 minutes:main
post after 6 minutes:main
post after 9 minutes:Thread-1
post after 12 minutes:Thread-1