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

Java 线程和中断:继续还是退出?,java,android,multithreading,interrupt,Java,Android,Multithreading,Interrupt,我能找到的官方文件和论坛帖子对此非常模糊。他们说这取决于程序员在被中断或退出后决定是否继续,但我找不到任何证明其中一个的条件文档 以下是相关代码: private final LinkedBlockingQueue<Message> messageQueue = new LinkedBlockingQueue<Message>(); // The sender argument is an enum describing who sent the message: t

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

以下是相关代码:

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.
}
private final LinkedBlockingQueue messageQueue=new LinkedBlockingQueue();
//sender参数是一个枚举,描述发送消息的人:用户、应用程序或另一端的人。
public void sendMessage(字符串地址、字符串消息、发件人){
messageQueue.offer(Message.create(地址、消息、发件人));
startSenderThread();
}
私有线程senderThread;
私有void startSenderThread(){
if(senderThread==null | |!senderThread.isAlive()){
senderThread=新线程(){
@凌驾
公开募捐{
loopSendMessage();
}
};
senderThread.start();
}
}
私有void loopSendMessage(){
消息队列消息;
//这个条件应该改为“true”吗?
而(!Thread.interrupted()){
试一试{
queuedMessage=messageQueue.poll(10,时间单位为秒);
}捕捉(中断异常e){
EasyLog.e(这是“SenderThread在轮询时中断了。”,e);
继续;
}
if(queuedMessage!=null)
sendOrQueueMessage(queuedMessage);
其他的
打破
}
}
//在此上下文中,队列意味着将消息存储在数据库中
//这样以后就可以发送了。
私有无效sendOrQueueMessage(消息消息消息){
//忽略不相关的代码。
}
sendMessage()
方法可以在任何时间从任何线程调用。它向消息队列发布一条要发送的新消息,如果发送方线程未运行,则启动发送方线程。发送方线程轮询队列并超时,然后处理消息。如果队列中没有更多消息,线程将退出

这是一款Android应用程序,可以自动处理短信。这是一个处理出站消息的类,决定是立即发送还是保存以稍后发送,因为Android有一个每小时100条消息的内部限制,只能通过根目录和访问设置数据库来更改

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

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


有谁能推荐一个行动方案吗?

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


也许当中断时,您会发送所有剩余的消息,而不接受新消息?

我的印象是中断并不总是由程序员控制的,我必须处理来自系统的中断,因为其他地方需要OS线程。这不是真的吗?我不认为操作系统上下文切换会引发中断,所以你不必担心。这个问题比我所能解释的更好:所以我唯一能得到中断的时间是我自己调用
interrupt()
还是将线程传递给另一个调用它的方法?