2012-03-26 4 views
0

を開始していない私は、スレッドThreadPoolExecutorおよびSocket。スレッドが

public final class MainListener extends Thread 
{ 

    private Socket ss; 

    public MainListener(final int socket) 
    { 
     this.socket = socket; 
     this.pool = new ThreadPoolExecutor(
     2, 
     4, 
     1000L, 
     TimeUnit.MILLISECONDS, 
     new LinkedBlockingQueue<Runnable>()); 
    } 

public void start() 
    { 
final ServerSocket ss = new ServerSocket(socket); 
while(true) 
{ 
    final Socket s = ss.accept(); 
    pool.execute(new MainThread(s)); 
} 
} 

のプール付き

public class MainThread extends Thread 
{ 
    private final Socket s; 

    public MainThread(final Socket s) 
    { 
     this.s = s; 
    } 

public void start() 
{ // some logic 
} 
} 

とクラスメインスレッドを持つクラスクラスを持っているMainThreadが作成されますが開始されません。それは「待っている」。
問題は何ですか?作成後にこのスレッドをどのように開始しますか?
私は

public MainThread(final Socket s) 
    { 
     this.s = s; 
     start(); 
    } 

ようMainThreadのコンストラクタを作るならば、すべてが正常に動作します。しかしそれは間違っている

答えて

4

runの代わりにstartをオーバーライドしました。この間違いを再び避けるために、常にRunnableを使用してください。

+1

...または常にstartの代わりにrunをオーバーライドします。 – aioobe

+0

ええ、Runnableを使用している場合、 '@ Override'を開始しようとするとコンパイルエラーになります... – artbristol

+0

...または常にRunnableを使用します;-) – dty

2

は、自分ののスレッドを作成してタスクを実行します。そうでなければ、プールされません。エグゼキュータを使用するポイントは、独自のスレッドを作成して開始することを避けることです。

Threadの代わりにRunnableを実装する必要があります。 ThreadPoolExecutorは、プールされたスレッドでrun()メソッドを呼び出します。あなたはがスレッドを作成するのですとき

はさえ、それはむしろ直接Threadを伸ばすよりも、Threadコンストラクタに渡すRunnableを作成するために、ほとんど常に良いでしょう。

+0

それは本当です。 Thx – Ilya

関連する問題