所以我正在编写一个多线程服务器,它接受服务器名称,端口,线程数和要求的文件名作为输入。我的设计是通过main创建一个套接字,然后扩展一个Runnable对象(它接受一个套接字和文件名)..我还有一个timertask,当5秒结束时触发,然后关闭并停止所有线程..我当前的设计是在main中创建套接字,将其传递给runnable(其中在条件x上有一个while循环,一遍又一遍地请求文件),然后当任务启动时,它将runnable中的私有共享变量x设置为false。
我面临很多破损的管道问题,这让我相信我的设计存在缺陷。我错过了什么吗?我没有使用同步/锁定变量。我应该为每个文件请求创建一个新套接字吗?
堆栈跟踪:
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:115)
at java.io.DataOutputStream.writeBytes(DataOutputStream.java:259)
at FR.filesRecv(Client.java:62)
at FR.run(Client.java:79)
at java.lang.Thread.run(Thread.java:637)
答案 0 :(得分:1)
一些一般性意见:
main
中分叉线程,然后只是睡眠5秒钟,然后将runnable
变量设置为false。不需要计时器任务。main
以确保它们正确完成,则可以立即从join()
退出。您也可以在线程启动之前设置thread.setDaemon(false);
,然后退出main
,JVM将不会停止,直到线程自行完成。runnable
变量,则需要确保volatile
变量为{{1}}。