我有一个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文件联网没有问题
答案 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方法的最后一行。