我能找到的官方文档和论坛帖子对此非常模糊。他们说由程序员决定在被中断或退出后是否继续,但我找不到任何可以保证其中一个条件的文档。
这是有问题的代码:
private final LinkedBlockingQueue<Message> messageQueue = new LinkedBlockingQueue<Message>();
// The sender argument is an enum describing who sent the message: the user, the app, or the person on the other end.
public void sendMessage(String address, String message, Sender sender) {
messageQueue.offer(Message.create(address, message, sender));
startSenderThread();
}
private Thread senderThread;
private void startSenderThread(){
if(senderThread == null || !senderThread.isAlive()){
senderThread = new Thread(){
@Override
public void run() {
loopSendMessage();
}
};
senderThread.start();
}
}
private void loopSendMessage(){
Message queuedMessage;
// Should this condition simply be `true` instead?
while(!Thread.interrupted()){
try {
queuedMessage = messageQueue.poll(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
EasyLog.e(this, "SenderThread interrupted while polling.", e);
continue;
}
if(queuedMessage != null)
sendOrQueueMessage(queuedMessage);
else
break;
}
}
// Queue in this context means storing the message in the database
// so it can be sent later.
private void sendOrQueueMessage(Message message){
//Irrelevant code omitted.
}
该sendMessage()
方法可以在任何时间从任何线程调用。它发布一条新消息以发送到消息队列,如果它没有运行,则启动发送者线程。发送者线程使用超时轮询队列,并处理消息。如果队列中没有更多消息,则线程退出。
它适用于自动处理 SMS 消息的 Android 应用程序。这是在一个处理出站消息的类中,决定是立即发送它们还是保存它们以便以后发送,因为 Android 有一个内部 100 条消息/小时的限制,只能通过 root 和访问设置数据库来更改。
用户或应用程序本身可以同时从应用程序的不同部分发送消息。决定何时排队等待以后需要同步处理,以避免需要原子消息计数。
我想优雅地处理中断,但如果有更多消息要发送,我不想停止发送消息。关于线程的 Java 文档说大多数方法在被中断后简单地返回,但这会在队列中留下未发送的消息。
有人可以推荐一个行动方案吗?