这两天开始留意了关于网络服务的一些架构。
主要研究了一下缓冲池技术,数据库连接池,线程池 等等。
然后看了jdk1.5中的java.util.concurrent这个包,这个包专门用来做多线程的并发的开发业务。。所以当真正要用到缓冲池的时候并不必要自己去实现,毕竟自己搞的东西的健壮性和可扩展性是相当有限的。
还有了解了一下非阻塞通讯的原理 主要用到javax。nio这个包。
下面是今天搞出的demo:
package com.sun.niodemo;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NBTest {
public NBTest(){
}
public void startService() throws IOException{
int channels = 0;
int nKeys = 0;
int currentSelector = 0;
Selector selector = Selector.open();
//建立Channel 并绑定到9000端口
ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),9000);
ssc.socket().bind(address);
//使设定non-blocking的方式。
ssc.configureBlocking(false);
//向Selector注册Channel及我们有兴趣的事件
SelectionKey sKey = ssc.register(selector, SelectionKey.OP_ACCEPT);
//printKeyInfo(s);
//不断轮询
while(true){
nKeys = selector.select();//事件通知方法。
//有时间发生
if(nKeys > 0){
Set allKeys = selector.selectedKeys();
Iterator it = allKeys.iterator();
while(it.hasNext()){
sKey = (SelectionKey)it.next();
printKeyInfo(sKey);
it.remove();
if(sKey.isAcceptable()){
//返回所注册的channel中绑定的socket
Socket socket = ((ServerSocketChannel)sKey.channel()).accept().socket();
SocketChannel sc = socket.getChannel();//返回这个socket的channel
sc.configureBlocking(false);//设定为非阻塞。
sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
System.out.println(++channels);
}
}
}
}
}
private void printKeyInfo(SelectionKey s) {
// TODO Auto-generated method stub
System.out.println(s.getClass());
}
public static void main(String args[]){
NBTest test = new NBTest();
/*try {
test.startService();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
test.testSelector();
}
public void testSelector(){
Selector [] selectors = new Selector[4000];
for(int i = 0;i<2000;i++){
try {
System.out.println(i);
selectors[i] = Selector.open();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
嗯 这是个不错的资源管理策略。。
最后就要去了解JMS了 这是java消息服务的api。当时第一次技术面试的时候那个帅哥问我如果要实现点对点通讯,该怎么实现,开始不太了解,回来之后想想 原来是问我是否了解JMS 。。所以明天早上得要继续努力啊。
金融危机带给IT界真是不小影响,要不是没活干 我也不想跳槽呢。。[align=left][/align]
主要研究了一下缓冲池技术,数据库连接池,线程池 等等。
然后看了jdk1.5中的java.util.concurrent这个包,这个包专门用来做多线程的并发的开发业务。。所以当真正要用到缓冲池的时候并不必要自己去实现,毕竟自己搞的东西的健壮性和可扩展性是相当有限的。
还有了解了一下非阻塞通讯的原理 主要用到javax。nio这个包。
下面是今天搞出的demo:
package com.sun.niodemo;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NBTest {
public NBTest(){
}
public void startService() throws IOException{
int channels = 0;
int nKeys = 0;
int currentSelector = 0;
Selector selector = Selector.open();
//建立Channel 并绑定到9000端口
ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),9000);
ssc.socket().bind(address);
//使设定non-blocking的方式。
ssc.configureBlocking(false);
//向Selector注册Channel及我们有兴趣的事件
SelectionKey sKey = ssc.register(selector, SelectionKey.OP_ACCEPT);
//printKeyInfo(s);
//不断轮询
while(true){
nKeys = selector.select();//事件通知方法。
//有时间发生
if(nKeys > 0){
Set allKeys = selector.selectedKeys();
Iterator it = allKeys.iterator();
while(it.hasNext()){
sKey = (SelectionKey)it.next();
printKeyInfo(sKey);
it.remove();
if(sKey.isAcceptable()){
//返回所注册的channel中绑定的socket
Socket socket = ((ServerSocketChannel)sKey.channel()).accept().socket();
SocketChannel sc = socket.getChannel();//返回这个socket的channel
sc.configureBlocking(false);//设定为非阻塞。
sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
System.out.println(++channels);
}
}
}
}
}
private void printKeyInfo(SelectionKey s) {
// TODO Auto-generated method stub
System.out.println(s.getClass());
}
public static void main(String args[]){
NBTest test = new NBTest();
/*try {
test.startService();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
test.testSelector();
}
public void testSelector(){
Selector [] selectors = new Selector[4000];
for(int i = 0;i<2000;i++){
try {
System.out.println(i);
selectors[i] = Selector.open();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
嗯 这是个不错的资源管理策略。。
最后就要去了解JMS了 这是java消息服务的api。当时第一次技术面试的时候那个帅哥问我如果要实现点对点通讯,该怎么实现,开始不太了解,回来之后想想 原来是问我是否了解JMS 。。所以明天早上得要继续努力啊。
金融危机带给IT界真是不小影响,要不是没活干 我也不想跳槽呢。。[align=left][/align]
非阻塞I/O与多线程并发
135

被折叠的 条评论
为什么被折叠?



