我有一个主线程
的类类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已创建但尚未启动。它正在“等待”
问题是什么?创建后如何启动此线程?
如果我像
public MainThread(final Socket s)
{
this.s = s;
start();
}
然后一切正常。但这是错误的
答案 0 :(得分:4)
您已覆盖start
而不是run
。为避免再次出现此错误,请始终使用Runnable
。
答案 1 :(得分:2)
ThreadPoolExecutor
创建其自己的线程来运行任务......否则它们不会被合并!使用执行程序的目的是避免创建和启动自己的线程。
您应该实施Runnable
而不是扩展Thread
。然后ThreadPoolExecutor
将在合并后的线程上调用您的run()
方法。
即使你做创建线程,创建Runnable
传递给Thread
构造函数而不是直接扩展Thread
几乎总是更好。< / p>