java中的多线程服务器。服务文件的线程

时间:2012-02-17 21:05:18

标签: java multithreading concurrency synchronization

所以我正在编写一个多线程服务器,它接受服务器名称,端口,线程数和要求的文件名作为输入。我的设计是通过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)

1 个答案:

答案 0 :(得分:1)

一些一般性意见:

  • 是的,每个客户端都应该有自己的服务器套接字连接。
  • 在服务器端,有一个服务器套接字,但是当从客户端接受连接时,会为每个处理程序创建一个新的套接字,以便与其相应的客户端通信。
  • 我会在main中分叉线程,然后只是睡眠5秒钟,然后将runnable变量设置为false。不需要计时器任务。
  • 如果您希望JVM快速停止,或者您可以在每个线程上调用main以确保它们正确完成,则可以立即从join()退出。您也可以在线程启动之前设置thread.setDaemon(false);,然后退出main,JVM将不会停止,直到线程自行完成。
  • 如果要从另一个线程设置runnable变量,则需要确保volatile变量为{{1}}。