Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程池执行器和套接字。螺纹为';t开始_Java_Multithreading_Sockets_Threadpool_Pool - Fatal编程技术网

Java 线程池执行器和套接字。螺纹为';t开始

Java 线程池执行器和套接字。螺纹为';t开始,java,multithreading,sockets,threadpool,pool,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

我有一个带主线的班

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

然后一切正常。但是这是错误的,
ThreadPoolExecutor
创建自己的线程来运行其上的任务。。。否则他们就不会在一起了!使用执行器的目的是避免创建和启动自己的线程

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


即使在创建线程时,创建一个
Runnable
传递给
Thread
构造函数也比直接扩展
Thread
要好。
ThreadPoolExecutor
创建自己的线程来运行任务。。。否则他们就不会在一起了!使用执行器的目的是避免创建和启动自己的线程

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


即使在创建线程时,创建一个
Runnable
传递给
Thread
构造函数也比直接扩展
Thread
要好。

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

…或始终覆盖run而不是start。是的,但如果使用Runnable,尝试
@覆盖
start将导致编译错误……或始终使用
Runnable
;-)。。。或者总是覆盖run而不是start。是的,但是如果使用Runnable,尝试
@覆盖
start将导致编译错误……或者总是使用
Runnable
;-)
public MainThread(final Socket s)
   {
      this.s = s;
      start();
   }