一、 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
分享到:
相关推荐
异步I/O操作通过Java的java.util.concurrent包和新的NIO.2包中的类来实现,允许I/O操作在不阻塞线程的情况下进行。此外,NIO.2还包含了网络通信方面的增强,例如支持组播的套接字通道。 在学习和使用这本书之后,...
- **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-master"这个项目中,学生可能将学习以下关键知识点: 1. **线程与进程**:理解线程和进程的区别,以及如何在Java中创建和管理线程。 2. **同步与互斥**:学习如何使用`...
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...
- **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:** ...
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.lang.Thread、java.util.concurrent包中的各种并发类(如Executor、ReentrantLock、CountDownLatch等),以及更高级的抽象如Future、Callable、CompletableFuture等。...
第四版则是针对Java SE 5.0及以后的版本,引入了更多的新特性,如注解(Annotations)、并发工具包(Concurrent Package)的增强、nio(New I/O)等。在这一版中,你将学到: 1. **注解**:了解如何使用注解来提供...
- 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...
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还引入了Swing的改进,包括新的LookAndFeel,使得Swing组件更加美观,并且提供了更好的可访问性和国际化支持。此外,AWT和Swing的事件模型也得到了优化,使得事件处理更加高效。 在安全方面,JDK 1.6增强了...
4. **自动装箱与拆箱(Autoboxing and Unboxing)** 自动装箱和拆箱简化了基本类型与对应的包装类之间的操作。在Java 1.5之前,需要手动进行装箱和拆箱,而1.5之后,系统会自动进行这些转换,提高了代码的简洁性。 ...
1. **自动内存管理**:Java 6引入了更高效的垃圾回收机制,如并发标记清除(Concurrent Mark Sweep, CMS)和G1垃圾收集器,提高了大型应用的性能。 2. **Swing组件增强**:Swing库在Java 6中得到了优化,包括新的...
4. **并发工具类(Concurrent Utilities)**:1.6版本中,`java.util.concurrent`包新增了更多的并发工具类,如`CountDownLatch`、`CyclicBarrier`和`Phaser`,这些工具使得多线程编程更为便捷和安全。 5. **NIO.2**...
4. **NIO.2(New I/O API)**: 虽然Java 7才正式引入NIO.2,但JDK 1.6已经开始为NIO的升级做准备,引入了文件通道(FileChannel)和选择器(Selector)等概念,提升了I/O操作的效率。 5. **改进的内存管理**: 通过...
2. **并发工具(Concurrent Utilities)**:并发工具类的扩展,如`java.util.concurrent`包,提供了线程安全的数据结构和同步机制,如`ExecutorService`,使得多线程编程更加简洁和高效。 3. **NIO.2(New I/O 2)*...
5. **NIO.2**:Java 6.0引入了非阻塞I/O的下一版本,即NIO.2,提供了更好的文件系统访问,包括异步I/O操作,如`java.nio.file`包中的`Files`和`Paths`类。 6. **动态语言支持**:Java 6.0添加了JSR 223(Scripting ...
在JDK 6中,Swing组件得到了加强,包括新的LookAndFeel,使得应用程序看起来更加现代。同时,AWT库也进行了更新,提高了与操作系统集成的能力。 5. **JDBC 4.0** JDBC 4.0引入了自动连接管理和批处理改进,增强了...