论坛首页 Java企业应用论坛

有感于<如果你用单线程写Socket>

浏览 7908 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-17  
看了<如果你用单线程写Socket>楼主写的socket例子,自己今天抽空也写了一个socket的例子,基于concurrent包的线程池的,发出来给大家看看.
package com.sluggard.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ConcurrentServer {
	
	private boolean stat = true;
	
	private ExecutorService executorService = Executors.newCachedThreadPool();
	
	private ServerSocket server;
	
	public void start() {
		try {
			server = new ServerSocket(9999);
			while(stat) {
				Socket socket = server.accept();
				executorService.submit(new MyCallable(this, socket));
			}
			server.close();
			executorService.shutdown();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void stop() {
		stat = false;
	}
	
	//通过这个类提供了一个简单的退出功能
	private static class MyCallable implements Callable<Socket> {

		ConcurrentServer source;
		
		Socket socket;
		
		@Override
		public Socket call() throws Exception {
			String s;
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			while((s = br.readLine()) != null) {
				if("quit".equals(s)){
					socket.close();
					source.stop();
				}
				System.out.println(s);
			}
			return null;
		}

		private MyCallable(ConcurrentServer source, Socket socket) {
			super();
			this.source = source;
			this.socket = socket;
		}

	}

	public static void main(String[] args) {
		ConcurrentServer server = new ConcurrentServer();
		server.start();
	}

}
   发表时间:2010-12-17   最后修改:2010-12-17
纳闷了,写Socket怎么不用NIO呢?是实时性要求很高吗?

改进下:Executor记得shutdown。
0 请登录后投票
   发表时间:2010-12-18  
请问这个例子里用线程池的意义在哪里呢?
0 请登录后投票
   发表时间:2010-12-19  
强调服务端并发的话还是用NIO实现比较好,concurrent包提供了一些线程管理,同步方面的API,写服务端可以参考mina的实现
0 请登录后投票
   发表时间:2010-12-20  
C_J 写道
纳闷了,写Socket怎么不用NIO呢?是实时性要求很高吗?

改进下:Executor记得shutdown。


我在28行有写shutdown啊~
0 请登录后投票
   发表时间:2010-12-20  
没看出有什么特别的地方.....
恕本人愚钝。
0 请登录后投票
   发表时间:2010-12-20  
boolean 要同步 不然可能会有问题
0 请登录后投票
   发表时间:2010-12-22  
yangyi 写道
boolean 要同步 不然可能会有问题

很有道理啊~是个boolean加上volatile好呢?还是给stop方法加上synchronized好呢
0 请登录后投票
   发表时间:2010-12-22  
boolean值在多线程中会产生同步问题,应该用原子级对象java.util.concurrent.atomic.AtomicBoolean进行控制,每次在改变值之前先boolean value = atomicBoolean.get(); 然后调用atomicBoolean.compareAndSet(value,newValue)进行赋值,这样考虑到了锁的问题又提高了效率.
0 请登录后投票
   发表时间:2010-12-22  
原子级对象是好东东啊
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics