2012-03-26 5 views
0

Ich habe eine Klasse-Klasse mit HauptthreadThreadPoolExecutor und Socket. Thema ist nicht gestartet

public class MainThread extends Thread 
{ 
    private final Socket s; 

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

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

und Klasse mit Pool von Threads

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

Mainthread erstellt, aber nicht gestartet. Es ist "warten".
Was ist das Problem? Wie starte ich diesen Thread nach der Erstellung?
wenn ich machen Konstruktor Mainthread wie

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

dann in der Regel alles funktioniert. Aber es ist falsch

Antwort

4

Sie haben start anstelle von run überschrieben. Um diesen Fehler erneut zu vermeiden, verwenden Sie immer Runnable.

+1

... oder überschreiben Sie immer run statt start. – aioobe

+0

Ja, aber wenn Sie Runnable verwenden, führt der Start von '@ Override 'zu einem Kompilierungsfehler ... – artbristol

+0

... oder verwenden Sie immer' Runnable' ;-) – dty

2

Die ThreadPoolExecutor schafft seine eigenen Themen, die Aufgaben auf laufen ... sonst würden sie nicht gepoolt werden! Der Zweck der Verwendung eines Executors besteht darin, das Erstellen und Starten eines eigenen Threads zu vermeiden.

Sie sollten Runnable implementieren statt Thread zu erweitern. Die ThreadPoolExecutor wird dann Ihre run() Methode auf dem Pool-Thread aufrufen.

Auch wenn Sie Threads erstellen tun, dann ist es fast immer besser, ein Runnable zu schaffen eher das Thread Konstruktor übergeben als Thread direkt erstreckt.

+0

Es ist auch wahr. Thx – Ilya