为什么在运行结束时打印输出语句不打印出来

时间:2013-09-23 12:58:15

标签: java android multithreading sockets

我有一个run方法,它启动一个新线程,并希望在它结束后从它启动另一个方法,但这不起作用。在方法的最后我添加了一些printout语句,它们只显示了几次,就像我第一次加载java程序时一样。通常他们不会表现出来。

我想知道他们为什么没有出现,并且有一种可靠的方式,比如回调方法,例如AsyncTask的onPostExecute(),我可以在Java线程上使用。

不知道为什么打印输出语句没有显示98%的时间。任何想法?

这里有点困惑。因为我认为文件将到达结束并且while循环中的count变量并且它将变为0或-1然后while循环将结束并且进程的执行将退出while循环并继续线程。这种情况没有发生,也没有意义。

我使用此代码收到的文件已完成,没有任何问题。但是我需要启动另一个线程方法将消息发送回Android客户端,告诉它该文件已成功接收。

代码的其余部分

 @Override
public void run() {

    FileOutputStream fos = null;
    BufferedOutputStream bos = null;
    BufferedInputStream bis = null;
    DataInputStream dis = null;
    int bufferSize = 0;

    File file = new File("/Users/UserName/sampleFile.db");

    // get input streams
    try {
    fos = new FileOutputStream(file);
    bos = new BufferedOutputStream(fos);
    bis = new BufferedInputStream(socket.getInputStream());
    dis = new DataInputStream(bis);
    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    try {
        bufferSize = socket.getReceiveBufferSize();
    } catch (SocketException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    int fileSizeFromClient = 0;
    long serialNumber = 0;

    try {
        fileSizeFromClient = dis.readInt();
        serialNumber = dis.readLong();
    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    String serialString = String.valueOf(serialNumber);

    System.out.println("filesize " + fileSizeFromClient);
    System.out.println("serialNumber " + serialString);
    System.out.println("bufferSize " + bufferSize);

    int count = 0;
    try {
        bos.flush();
    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    byte[] buffer = new byte[fileSizeFromClient];
    try {
        while((count = dis.read(buffer)) > 0){
            bos.write(buffer, 0, count);

           if(count == -1){ // <-- this line does not help break out of loop
             break;
            }


        }

        System.out.println("size of file written " + buffer.length); // <-- does not print out
        socket.close();

        System.out.println("test out 1"); // <-- does not print out

    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);

     } catch (Exception ex) {
            Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
        }

  System.out.println("test out 2"); // <-- does not print out

}  // end run
编辑:忘了提到这是针对Java桌面应用程序,而不是Android,但它连接的客户端是Android设备。发送和接收任何文件都没有问题,套接字和TCP / IP文件联网没有问题

1 个答案:

答案 0 :(得分:2)

我找到了问题的答案。

Java服务器卡在此行上或挂起:

  while((count = dis.read(buffer)) > 0){
        bos.write(buffer, 0, count);

因为服务器所连接的Android客户端中的outputStream对象。如果你像这样关闭客户端中的outputStream:

 dos.close();   // for DataOutputStream dos;

客户端中的InputStream对象无效,它只是OutputStream。如果客户端中的OutputStream在for循环之后立即关闭,那么它会阻止Java Sever在for循环中的阻塞或挂起。

来自Android客户端的

代码

   while ((count = bis.read(bytes)) > 0) {
          dos.write(bytes, 0, count);
         }
             dos.close();

在此调整之后,for循环后Java服务器中的所有System.out.println语句现在都可以正常工作。一直到run方法的最后一行。