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