首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2013-01-06 
有感于如果你用单线程写Socket看了如果你用单线程写Socket楼主写的socket例子,自己今天抽空也写了一个

有感于<如果你用单线程写Socket>
看了<如果你用单线程写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;@Overridepublic 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();}}
1 楼 C_J 2010-12-17   纳闷了,写Socket怎么不用NIO呢?是实时性要求很高吗?

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

改进下:Executor记得shutdown。

我在28行有写shutdown啊~ 5 楼 zhaoxin1943 2010-12-20   没看出有什么特别的地方.....
恕本人愚钝。 6 楼 yangyi 2010-12-20   boolean 要同步 不然可能会有问题 7 楼 sydra 2010-12-22   yangyi 写道boolean 要同步 不然可能会有问题
很有道理啊~是个boolean加上volatile好呢?还是给stop方法加上synchronized好呢 8 楼 yanglei998 2010-12-22   boolean值在多线程中会产生同步问题,应该用原子级对象java.util.concurrent.atomic.AtomicBoolean进行控制,每次在改变值之前先boolean value = atomicBoolean.get(); 然后调用atomicBoolean.compareAndSet(value,newValue)进行赋值,这样考虑到了锁的问题又提高了效率. 9 楼 xuershan 2010-12-22   原子级对象是好东东啊 10 楼 sydra 2010-12-22   yanglei998 写道boolean值在多线程中会产生同步问题,应该用原子级对象java.util.concurrent.atomic.AtomicBoolean进行控制,每次在改变值之前先boolean value = atomicBoolean.get(); 然后调用atomicBoolean.compareAndSet(value,newValue)进行赋值,这样考虑到了锁的问题又提高了效率.
好办法啊~还是不习惯用java.util.concurrent.atomic包的东西,受益了,非常感谢~

热点排行