锁定老帖子 主题:有感于<如果你用单线程写Socket>
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-17
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(); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-17
最后修改:2010-12-17
纳闷了,写Socket怎么不用NIO呢?是实时性要求很高吗?
改进下:Executor记得shutdown。 |
|
返回顶楼 | |
发表时间:2010-12-18
请问这个例子里用线程池的意义在哪里呢?
|
|
返回顶楼 | |
发表时间:2010-12-19
强调服务端并发的话还是用NIO实现比较好,concurrent包提供了一些线程管理,同步方面的API,写服务端可以参考mina的实现
|
|
返回顶楼 | |
发表时间:2010-12-20
C_J 写道 纳闷了,写Socket怎么不用NIO呢?是实时性要求很高吗?
改进下:Executor记得shutdown。 我在28行有写shutdown啊~ |
|
返回顶楼 | |
发表时间:2010-12-20
没看出有什么特别的地方.....
恕本人愚钝。 |
|
返回顶楼 | |
发表时间:2010-12-20
boolean 要同步 不然可能会有问题
|
|
返回顶楼 | |
发表时间:2010-12-22
yangyi 写道 boolean 要同步 不然可能会有问题
很有道理啊~是个boolean加上volatile好呢?还是给stop方法加上synchronized好呢 |
|
返回顶楼 | |
发表时间:2010-12-22
boolean值在多线程中会产生同步问题,应该用原子级对象java.util.concurrent.atomic.AtomicBoolean进行控制,每次在改变值之前先boolean value = atomicBoolean.get(); 然后调用atomicBoolean.compareAndSet(value,newValue)进行赋值,这样考虑到了锁的问题又提高了效率.
|
|
返回顶楼 | |
发表时间:2010-12-22
原子级对象是好东东啊
|
|
返回顶楼 | |