System.exit vs break或return

时间:2013-07-10 05:38:27

标签: java activemq

我正在执行ActiveMq程序,将文件放入队列。

public static void main(String[] args) throws JMSException, IOException {
    FileInputStream in;
    //Write the file from some location that is to be uploaded on ActiveMQ server

    in = new FileInputStream("d:\\test-transfer-doc-1.docx");
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                    "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://admin:admin@localhost:8161/fileserver/");
    ActiveMQConnection connection = (ActiveMQConnection) connectionFactory
                    .createConnection();
    connection.start();
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Queue destination = session.createQueue("stream.file");
    OutputStream out = connection.createOutputStream(destination);

    // now write the file on to ActiveMQ
    byte[] buffer = new byte[1024];
    for (int bytesRead=0;bytesRead!=-1;) {
            bytesRead = in.read(buffer);
            System.out.println("bytes read="+bytesRead);
            if (bytesRead == -1) {
                out.close();
                System.out.println("Now existiong from prog");
                //System.exit(0);
                break;
            }
            else{
                System.out.println("sender\r\n");
                out.write(buffer, 0, bytesRead);
            }
    }
    System.out.println("After for loop");  
}

当bytesRead == -1时,我想在JVM任务完成时从JVM卸载程序。为此,我最初使用break关键字,并在Eclipse控制台上生成以下输出

enter image description here

使用此程序,程序无法从JVM卸载,因为控制台RED按钮仍处于活动状态。

现在我使用System.exit(0)来实现此目的,并从JVM退出程序。但我不想为此目的使用System.exit(0)。我也尝试使用简单的void return代替break,但它也无效。

请说明为什么breakreturn在这种情况下不能用于结束程序以及为什么它仍在运行?

此致

阿伦

4 个答案:

答案 0 :(得分:5)

您需要关闭资源(队列,输入流),因为它们可以使程序保持活动状态,之后简单的返回就足以结束程序。

答案 1 :(得分:2)

返回和中断工作。问题是that connection.start();启动一个Thread(你可以在调试模式下以[Active MQ Transport ...]的名义看到它)直到存在一个正在运行的非守护进程线程,除非调用System.exit,否则JVM不会终止。

答案 2 :(得分:2)

JVM仍然挥之不去的原因可能是某些用户线程仍未完成。从初步调查我相信你的Session内部运行一个线程。我相信你应该在停止之前停止你的会话并关闭你的连接。这应该可以解决你的问题。

答案 3 :(得分:1)

只要非恶魔线程正在运行,JVM就会运行 - 所以上面的所有人都是正确的:你必须关闭所有资源,以便非恶魔线程关闭。