2011-10-31 52 views
2

我想建立一個服務器,可以同時接受來自多個客戶端的文件。java網絡多線程

但它是按順序提交文件,我不明白爲什麼....

誰能幫助?謝謝

我張貼我的兩個線程的片段。每次我接受連接,我實例化提交類並執行它們。

This is main thread that accepts connections 
int poolSize = 1; 
    int maxPoolSize = 3; 
    long keepAliveTime = 10; 
    ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(5); 
    threadPool = new ThreadPoolExecutor(poolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, queue); 
+0

你的意思是「它看起來像'clientServer.accept()'阻塞。」這應該是阻塞呼叫,應該等到客戶端連接到服務器。你是否設置clientServer對象的超時? – guru

+2

它看起來很好,它是什麼讓你相信它不是平行運行?作爲一個附註,如果你在tomcat下運行這個客戶端,可以通過http post提交文件,你可以免費獲得所有這些。 – Kevin

+1

你是否同時提交文件?你是否只使用一個連接來使用所有的網絡帶寬? –

回答

2

Submission類的run()方法中的鎖定導致您的代碼部分順序運行。該鎖通過構造函數傳入,以便在所有子項之間共享,因此它們在運行stats.logSubmission之前都調用lock.lock()。這意味着一次只有一個線程將調用logSubmission。

作爲一種快速獲得併發的方法;嘗試刪除鎖,而不是馬上寫入文件,嘗試將日誌記錄存儲在ConcurrentLinkedQueue中。然後,您可以稍後將其刷新到磁盤,或者在某些情況下(大小,時間,...)將其刷新到磁盤。該隊列是無鎖的,快速且線程安全的。

+0

哦..是的..對不起 –

0

本質上,您需要分開您的.accept()新連接的線程以及處理這些請求的位置。

每當您在服務器套接字上調用.accept()時,都會生成一個新線程來處理該請求,並將該線程從.accept()方法傳遞給該線程。