线程和中断:继续还是退出?

时间:2013-08-22 20:04:13

标签: java android multithreading interrupt

我能找到的官方文档和论坛帖子对此非常模糊。他们说,由程序员决定是否在被打断或退出后继续,但我找不到任何可以保证其中一个条件的文件。

以下是相关代码:

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()方法可以在任何时候从任何线程调用。它发布一条新消息以发送到消息队列,并在它未运行时启动发送方线程。发送方线程以超时方式轮询队列,并处理消息。如果队列中没有其他消息,则退出该线程。

适用于自动执行短信处理的Android应用。这是一个处理出站消息的类,决定是立即发送它们还是保存它们以便稍后发送,因为Android有内部100个消息/小时限制,只能通过root和访问设置数据库来更改。

消息可以由用户或应用程序本身同时从应用程序的不同部分发送。决定何时排队等待以后需要同步处理以避免需要原子消息计数。

我想优雅地处理中断,但如果还有更多要发送的话,我不想停止发送消息。关于线程的Java文档说大多数方法只是在被中断后返回,但这会在队列中留下未发送的消息。

有人可以推荐一个行动方案吗?

1 个答案:

答案 0 :(得分:1)

我想答案取决于你被打断的原因?通常线程被中断,因为一些其他进程/线程正在尝试取消或终止它。在这些情况下,停止是适当的。

也许在被打断时,你发出所有剩余的消息而不接受新消息?