ThreadPoolExecutor и Socket.Тема не запущена - PullRequest
0 голосов
/ 26 марта 2012

У меня есть класс класса с основным потоком

public class MainThread extends Thread
{
   private final Socket s;

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

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

и класс с пулом потоков

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 создан, но не запущен.Это «ожидание».
В чем проблема?Как запустить этот поток после создания?
, если я создаю конструктор MainThread, как

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

, тогда все работает нормально.Но это неправильно

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Вы переопределили start вместо run.Чтобы избежать повторения этой ошибки, всегда используйте Runnable.

2 голосов
/ 26 марта 2012

ThreadPoolExecutor создает свои собственные потоки для выполнения задач ... в противном случае они не будут объединены!Смысл использования исполнителя - избегать создания и запуска собственного потока.

Вы должны реализовывать Runnable вместо расширения Thread.ThreadPoolExecutor затем вызовет ваш метод run() в потоке пула.

Даже когда вы делаете создания потоков, почти всегда лучше создать Runnable для передачи вThread конструктор, а не расширение Thread напрямую.

...