2011-10-31 3 views
2

複数のクライアントからのファイルを同時に受け付けることができるサーバーを構築しようとしています。java network multithreading

しかし、それは順番にファイルを提出していると私はなぜ....

を理解していない誰が助けることはできますか?ありがとうございます

私は2つのスレッドのスニペットを投稿します。私が接続を受け入れるたびに、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); 
+0

あなたが意味することは、 "それは 'clientServer.accept()'がブロックされているようです。"これはブロッキング呼び出しであり、クライアントがサーバーに接続するまで待機する必要があります。 clientServerオブジェクトでタイムアウトを設定していますか? – guru

+2

それはあなたがそれが並行して走っていないと信じさせるのは何ですか?あなたがtomcatの下でこれを実行するなら、クライアントがhttp post経由でファイルを提出することができれば、これをすべて無料で入手できます。 – Kevin

+1

ファイルを同時に提出していますか? 1つの接続ですべてのネットワーク帯域幅を使用していますか? –

答えて

2

Submissionクラスのrun()メソッドのロックによって、コードのその部分が順番に実行されています。そのロックはコンストラクタを介して渡されるので、すべての子どもの間で共有されるので、stats.logSubmissionを実行する前にlock.lock()を呼び出します。これは、一度に1つのスレッドだけがlogSubmissionを呼び出すことを意味します。

これを取得する簡単な方法として、ロックを解除してすぐにファイルに書き込むのではなく、ログレコードをConcurrentLinkedQueueに保存してみてください。その後、実行中のある時点またはある条件(サイズ、時間、..)でディスクにフラッシュすることができます。このキューは、ロックフリーで高速でスレッドセーフです。

+0

ああ..はい..ごめんなさい –

0

基本的には、新しい接続である.accept()のスレッドと、それらの要求を処理するスレッドを分ける必要があります。

サーバーソケットで.accept()を呼び出すたびに、その要求を処理する新しいスレッドを生成し、.accept()メソッドからのソケット接続をそのスレッドに渡します。