加入一个ServerSocket正在另一个线程堵塞accept,那如何停止accept或者关闭Socket?
Server socket 设置下超时
setSoTimeout
然后在Listen线程中用interrupt
其实直接close socket也可以,不过会抛出异常,我的意思是有什么比较安全而又简单的办法?难道要加一个标志,然后要关闭的时候把标志设为stop,然后连接listernSocket?这样也未免太麻烦了
JDK5.0里面新增了java.util.concurrent包(对于多线程的开发建议尽量使用这个包),下面是javadoc里面的样例代码
用法示例
下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 Executors.newFixedThreadPool(int)
工厂方法:
java 代码
- class NetworkService implements Runnable {
- private final ServerSocket serverSocket;
- private final ExecutorService pool;
- public NetworkService(int port, int poolSize)
- throws IOException {
- serverSocket = new ServerSocket(port);
- pool = Executors.newFixedThreadPool(poolSize);
- }
- public void run() { // run the service
- try {
- for (;;) {
- pool.execute(new Handler(serverSocket.accept()));
- }
- } catch (IOException ex) {
- pool.shutdown();
- }
- }
- }
- class Handler implements Runnable {
- private final Socket socket;
- Handler(Socket socket) { this.socket = socket; }
- public void run() {
- // read and service request on socket
- }
- }
下列方法分两个阶段关闭 ExecutorService。第一阶段调用 shutdown 拒绝传入任务,然后调用 shutdownNow(如有必要)取消所有遗留的任务:
java 代码
- void shutdownAndAwaitTermination(ExecutorService pool) {
- pool.shutdown(); // Disable new tasks from being submitted
- try {
- // Wait a while for existing tasks to terminate
- if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
- pool.shutdownNow(); // Cancel currently executing tasks
- // Wait a while for tasks to respond to being cancelled
- if (!pool.awaitTermination(60, TimeUnit.SECONDS))
- System.err.println("Pool did not terminate");
- }
- } catch (InterruptedException ie) {
- // (Re-)Cancel if current thread also interrupted
- pool.shutdownNow();
- // Preserve interrupt status
- Thread.currentThread().interrupt();
- }
- }
内存一致性效果:线程中向 ExecutorService
提交 Runnable
或 Callable
任务之前的操作 happen-before 由该任务所提取的所有操作,后者依次 happen-before 通过 Future.get()
获取的结果。