многопоточность сети Java - PullRequest
2 голосов
/ 31 октября 2011

Я пытаюсь создать сервер, который может одновременно принимать файлы от нескольких клиентов.

Но он подает файлы последовательно, и я не понимаю, почему ....

Кто-нибудь может помочь? Спасибо

Я публикую свой фрагмент из двух тем. каждый раз, когда я принимаю соединение, я создаю экземпляр класса Submission и выполняю их.

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);

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Блокировка в методе run () класса Submission заставляет эту часть вашего кода выполняться последовательно.Эта блокировка передается через конструктор, поэтому она используется всеми вашими детьми, поэтому все они вызывают lock.lock () перед запуском stats.logSubmissionЭто означает, что только один поток одновременно будет вызывать logSubmission.

Как быстрый способ получить это одновременно;попробуйте снять блокировку и вместо прямой записи в файлы попробуйте сохранить записи журналов в ConcurrentLinkedQueue .Затем вы можете сбросить их на диск на более позднем этапе выполнения или при некоторых условиях (размер, время и т. Д.).Эта очередь без блокировки, быстрая и поточно-ориентированная.

0 голосов
/ 02 декабря 2011

По сути, вам нужно разделить поток, в котором вы .accept() новые соединения, и где вы обрабатываете эти запросы.

Каждый раз, когда вы вызываете .accept() на сокете сервера, порождает новый поток для обработкиэтот запрос, и передать в этот поток соединение сокета из метода .accept().

...