繁体   English   中英

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

[英]why are printout statements at end of run method not printing out

我有一个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文件网络都没有问题

我找到了问题的答案。

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方法的最后一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM