`
jie2workjava
  • 浏览: 151099 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

concurrent and nio

    博客分类:
  • j2se
阅读更多

 一、 java.util.concurrent

线程池: ExecutorService pool = Executors.newFixedThreadPool(poolSize);
           用工具类Executors产生线程池(ThreadPoolExecutor),线程池大小poolSize

将线程加入到线程池:  pool.execute(new Handler(serverSocket.accept()));

同步集合:CopyOnWriteArrayList<E> 当遍历操作的数量大大超过可变操作的数量时使用。

原子操作:AtomicInteger 可以用原子方式更新的 int

 

 

 

二、java.nio

服务器端

public class MyNioServer extends Thread{
	private Selector selector;
	private ServerSocketChannel ssChannel;
	private ByteBuffer bbf;
	public static void main(String[] args) {
		new MyNioServer().start();
	}
	public MyNioServer(){
		try {
			selector = Selector.open();//选择器
			ssChannel = ServerSocketChannel.open();//服务器端通道
			ServerSocket ss = ssChannel.socket();//通道的socket
			ss.bind(new InetSocketAddress(3333));//设置监听端口
			ssChannel.configureBlocking(false);//设置为非阻塞
			ssChannel.register(selector,SelectionKey.OP_ACCEPT);//注册有选择器监听
			
			bbf = ByteBuffer.allocate(100);
			System.out.println("======服务器启动======");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	@Override
	public void run() {
		do {
			try {
				selector.select();
//				System.out.println("======选择器启动======");
				Set<SelectionKey> selectedKeys = selector.selectedKeys();
				Iterator it = selectedKeys.iterator();
				while (it.hasNext()) {
					SelectionKey key = (SelectionKey) it.next();
					it.remove();
					dealSelectionKey(key);
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} while (true);
	}
	public void dealSelectionKey(SelectionKey key){
		System.out.println("========处理请求=======");
		if(key.isAcceptable()){
			try {
				System.out.println("=======链接=======");
				ServerSocketChannel ssChannel = (ServerSocketChannel)key.channel(); //拿到注册过的sschannel
				SocketChannel sChannel = ssChannel.accept();                        //接受的schannel
				sChannel.configureBlocking(false);                                  //设置成非阻塞 
				sChannel.register(this.selector, SelectionKey.OP_READ);                      //注册schannel
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else if(key.isReadable()){
			System.out.println("=======读取=======");
			SocketChannel sChannel = (SocketChannel)key.channel();
			try {
				int count = sChannel.read(bbf);
				if(count>0){//读到了数据
					byte[] bs = bbf.array();
					System.out.println(count+"----"+new String(bs));
					key.interestOps(SelectionKey.OP_WRITE);
				}else{
					System.out.println("===================channel is close================");
					sChannel.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			bbf.clear();
			System.out.println("服务器端读取完成");
		}else if(key.isValid() && key.isWritable()){
			System.out.println("=======写出=======");
			try {
				SocketChannel channel = (SocketChannel) key.channel();
				channel.write(ByteBuffer.wrap(new byte[]{'h'}));
				key.interestOps(SelectionKey.OP_READ);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("服务器端写出完成");
		}
		
	}
}

 

客服端(socket):

Socket socket = new Socket("192.168.102.5",3333);
		String msg = new String("hello nio");
		socket.getOutputStream().write(msg.getBytes());
		socket.getOutputStream().flush();
		System.out.println(socket.getInputStream().read());;
		Thread.sleep(5000);
		socket.getOutputStream().write(new byte[]{'q'});
		socket.getOutputStream().flush();
		Thread.sleep(1000);      //一定要sleep一会
		socket.close();

 如果没有sleep:

java.io.IOException: An established connection was aborted by the software in your host machine

分享到:
评论

相关推荐

    Java I-O NIO and NIO2

    异步I/O操作通过Java的java.util.concurrent包和新的NIO.2包中的类来实现,允许I/O操作在不阻塞线程的情况下进行。此外,NIO.2还包含了网络通信方面的增强,例如支持组播的套接字通道。 在学习和使用这本书之后,...

    Java - The Well-Grounded Java Developer

    - **Locks and Conditions**: Overview of the `java.util.concurrent.locks` package, which provides more flexible locking mechanisms compared to traditional `synchronized` blocks. - **Fork/Join ...

    Concurrent-and-real-time-programming:加的斯大学关于并行和实时编程的实践

    在"Concurrent-and-real-time-programming-master"这个项目中,学生可能将学习以下关键知识点: 1. **线程与进程**:理解线程和进程的区别,以及如何在Java中创建和管理线程。 2. **同步与互斥**:学习如何使用`...

    java7帮助文档

    The java.nio.file package and its related package, java.nio.file.attribute, provide comprehensive support for file I/O and for accessing the file system; see File I/O (featuring NIO.2). NIO stands for...

    jdk1.7_80 window.64

    - **NIO.2 (New I/O API):** Enhancements to the non-blocking I/O capabilities, including new classes for file system operations, file channels, and file attributes. - **Scripting Language Support:** ...

    JavaSE-6.0-英文手册(2008/11/30_FullUpdate)

    Legal Notices API, Language, and VM Specs Features Guides Release Notes Tool Docs Tutorials and Training JavaTM SE 6 Platform at a Glance This document covers the JavaTM Platform, Standard Edition...

    java并发编程(好文)

    Java提供了丰富的并发工具和库,包括java.lang.Thread、java.util.concurrent包中的各种并发类(如Executor、ReentrantLock、CountDownLatch等),以及更高级的抽象如Future、Callable、CompletableFuture等。...

    Thinking in Java 3th and 4th Edition+代码+答案

    第四版则是针对Java SE 5.0及以后的版本,引入了更多的新特性,如注解(Annotations)、并发工具包(Concurrent Package)的增强、nio(New I/O)等。在这一版中,你将学到: 1. **注解**:了解如何使用注解来提供...

    S7A驱动720版本

    - Wrong OPC timestamp occured when driver was running in NIO Simulation Mode - The driver could crash when the driver was stopped (either by hand or when the demo time was expired) and in the same...

    jdk 1.5 api chm 中文

    8. **NIO.2(New I/O 2)**:虽然JDK 1.5仅引入了NIO(非阻塞I/O),但NIO.2在后续版本中引入,增加了文件系统API,支持异步I/O操作和文件通道等。 9. **并发工具类(Concurrent Utilities)**:包括`java.util....

    jdk-1.6.rar

    JDK 1.6还引入了Swing的改进,包括新的LookAndFeel,使得Swing组件更加美观,并且提供了更好的可访问性和国际化支持。此外,AWT和Swing的事件模型也得到了优化,使得事件处理更加高效。 在安全方面,JDK 1.6增强了...

    java jdk 1.5 API html

    4. **自动装箱与拆箱(Autoboxing and Unboxing)** 自动装箱和拆箱简化了基本类型与对应的包装类之间的操作。在Java 1.5之前,需要手动进行装箱和拆箱,而1.5之后,系统会自动进行这些转换,提高了代码的简洁性。 ...

    良葛格java jdk 6.0学习笔记代码.rar

    1. **自动内存管理**:Java 6引入了更高效的垃圾回收机制,如并发标记清除(Concurrent Mark Sweep, CMS)和G1垃圾收集器,提高了大型应用的性能。 2. **Swing组件增强**:Swing库在Java 6中得到了优化,包括新的...

    0JDK1.6 API帮助文档_jdk1.6_

    4. **并发工具类(Concurrent Utilities)**:1.6版本中,`java.util.concurrent`包新增了更多的并发工具类,如`CountDownLatch`、`CyclicBarrier`和`Phaser`,这些工具使得多线程编程更为便捷和安全。 5. **NIO.2**...

    jdk-6u45-linux-x64

    4. **NIO.2(New I/O API)**: 虽然Java 7才正式引入NIO.2,但JDK 1.6已经开始为NIO的升级做准备,引入了文件通道(FileChannel)和选择器(Selector)等概念,提升了I/O操作的效率。 5. **改进的内存管理**: 通过...

    JDK_API_1_6_zh_CN.part16-18.rar

    2. **并发工具(Concurrent Utilities)**:并发工具类的扩展,如`java.util.concurrent`包,提供了线程安全的数据结构和同步机制,如`ExecutorService`,使得多线程编程更加简洁和高效。 3. **NIO.2(New I/O 2)*...

    JAVASE6.0_Api_en\docs\api

    5. **NIO.2**:Java 6.0引入了非阻塞I/O的下一版本,即NIO.2,提供了更好的文件系统访问,包括异步I/O操作,如`java.nio.file`包中的`Files`和`Paths`类。 6. **动态语言支持**:Java 6.0添加了JSR 223(Scripting ...

    Java JDK 6学习笔记——ppt简体版

    在JDK 6中,Swing组件得到了加强,包括新的LookAndFeel,使得应用程序看起来更加现代。同时,AWT库也进行了更新,提高了与操作系统集成的能力。 5. **JDBC 4.0** JDBC 4.0引入了自动连接管理和批处理改进,增强了...

Global site tag (gtag.js) - Google Analytics