【问题标题】:ThreadPoolExecutor and Socket. Thread isn't startedThreadPoolExecutor 和 Socket。线程未启动
【发布时间】:2012-03-26 12:35:51
【问题描述】:

我有一个带主线程的类

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

然后一切正常。但这是错误的

【问题讨论】:

    标签: java multithreading sockets threadpool pool


    【解决方案1】:

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

    【讨论】:

    • ...或者总是覆盖 run 而不是 start。
    • 是的,但是如果你使用 Runnable,尝试@Override start 会导致编译错误...
    • ...或始终使用Runnable ;-)
    【解决方案2】:

    ThreadPoolExecutor 创建了它的自己的 线程来运行任务……否则它们不会被池化!使用执行器的目的是避免创建和启动您自己的线程。

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

    即使您确实创建了线程,创建Runnable 以传递给Thread 构造函数几乎总是比直接扩展Thread 更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      相关资源
      最近更新 更多