ThreadPoolExecutor和Socket。线程未启动

时间:2012-03-26 12:35:52

标签: java multithreading sockets threadpool pool

我有一个主线程

的类类
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 个答案:

答案 0 :(得分:4)

您已覆盖start而不是run。为避免再次出现此错误,请始终使用Runnable

答案 1 :(得分:2)

ThreadPoolExecutor创建其自己的线程来运行任务......否则它们不会被合并!使用执行程序的目的是避免创建和启动自己的线程。

您应该实施Runnable而不是扩展Thread。然后ThreadPoolExecutor将在合并后的线程上调用您的run()方法。

即使你创建线程,创建Runnable传递给Thread构造函数而不是直接扩展Thread几乎总是更好。< / p>