Asa*_*evo 8 java multithreading
我的Java.NIO套接字服务器中有一个线程池.我有时会收到像Connection reset by peer或Broken Pipe等的运行时错误.
我的问题是:抛出异常时线程被杀死了吗?如果是 - 是在线程池中创建的新线程代替被杀死的线程?
这是我的ThreadManager:
import java.nio.channels.SocketChannel;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadsManager {
private ExecutorService threadPool = null;
private LiveConnectionsManager liveConnectionsManager;
private int threadPoolSize = 35; //number of tasks thread
public ThreadsManager(LiveConnectionsManager liveConnectionsManager) {
this.liveConnectionsManager = liveConnectionsManager;
threadPool = Executors.newFixedThreadPool(threadPoolSize);
ServerActions.threadPool = threadPool;
}
public void processNewMessage(SocketChannel socketChannel, Client client)
{
threadPool.execute(new MessagesProcessor(socketChannel, client, liveConnectionsManager));
}
public void closeConnection(SocketChannel socketChannel, Client client) {
threadPool.execute(new LogoutClient(socketChannel, client, null));
}
}
Run Code Online (Sandbox Code Playgroud)
rai*_*mar 12
当您使用ExecutorService创建线程池时.
所以是的,ExecutorService.newFixedThreadPool(..)确保线程数量是恒定的,如果它们被任何异常/错误杀死并且有足够的任务等待线程.来自java doc的文字清楚地说明了这一点:
直接来自java doc:newFixedThreadPool
创建一个线程池,该线程池重用在共享的无界队列中运行的固定数量的线程.在任何时候,最多nThreads线程将是活动的处理任务.如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到线程可用.如果任何线程由于在关闭之前执行期间的故障而终止,则在需要执行后续任务时将使用新的线程.池中的线程将一直存在,直到它被明确关闭.
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int)
| 归档时间: |
|
| 查看次数: |
6745 次 |
| 最近记录: |