![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
丨Q ,Q丨
这个作者很懒,什么都没留下…
展开
-
单向数据通路——管道(Pipe)
单向数据通路——管道(Pipe)管道有两端:读端和写端,Pipe的实例可以获得两个通道,分别对应管道的两个写端。注意,Pipe的两个端对应的通道都是SelectableChannel的子类,所以可以使用非阻塞的通信方式。使用方法1. 向管道中写数据写数据时,先获得写端对应的通道。然后对通道进行写操作。//获得管道的写通道Pipe.SinkChannel sinkChannel = pipe.sink();//写数据sinkChannel.write(output);2. 从管道中读数据原创 2020-07-21 15:25:39 · 512 阅读 · 0 评论 -
基于UDP的非阻塞通信
基于UDP的非阻塞通信如果使用UDP进行阻塞通信,则会在receive()时阻塞(在没有报文到达时)。如果使用非阻塞通信,就需要“知道”什么时候调用receive(),与基于TCP的非阻塞通信相同,需要一个selector来监听管道的“事件”。当有报文到达时,事件触发。通过selector,在事件触发时调用receive()接收报文即可。通信流程1. 创建DatagramChannelDatagramChannel datagramChannel = DatagramChannel.open()原创 2020-07-21 14:49:21 · 2628 阅读 · 0 评论 -
使用NIO进行阻塞式通信-基于UDP协议
文章目录使用NIO进行阻塞式通信-基于UDP协议流程服务端1. 创建`DatagramChannel`2. 绑定本地端口3. 接收报文4. 处理报文5. 给客户端发送报文举例:Echo服务端 + 客户端服务端客户端使用NIO进行阻塞式通信-基于UDP协议UDP协议与TCP协议之间最直观的差别就是UDP协议是无连接的通信协议使用UDP进行通信时,服务端和客户端在代码层面几乎没有区别。通信大致过程如下:服务端接收客户端报文处理报文给客户端发送报文客户端给服务端发送报文接收服务原创 2020-07-21 14:24:40 · 234 阅读 · 0 评论 -
多线程+非阻塞通信导致多次处理读事件
多线程+非阻塞通信导致多次处理读事件有问题的代码:Echo服务端简单的解释一下,事件处理器handler有一个handle(SelectionKey)方法,根据方法的不同,执行不同的操作。对于读事件,创建一个线程进行读事件处理。public class MutiThreadServer { private static final int PORT = 8888; private ServerSocketChannel severSocketChannel; private Selector s原创 2020-06-27 11:47:09 · 145 阅读 · 0 评论 -
NIO非阻塞通信简介及基于TCP的非阻塞通信
NIO非阻塞通信简介及基于TCP的非阻塞通信通信方式简述阻塞式的通信以基于TCP的通信方式来说明:创建ServerSocket(或ServerSocketChannel)、调用accept()方法获取客户端的Socket连接、通过Socket通信、关闭Socket连接。对于阻塞式的通信,最影响效率的其实是SocketChannel.read()或通过Socket获得的输入流的InputStream.read()。当服务端调用这些输入方法时,线程就会进入阻塞状态,直到客户端发来数据才被唤醒。如果用单原创 2020-06-27 11:06:23 · 439 阅读 · 0 评论 -
NIO
使用NIO进行阻塞式通信-基于TCP协议原创 2020-06-27 01:16:46 · 148 阅读 · 0 评论 -
使用NIO进行阻塞式通信-基于TCP协议
使用NIO进行阻塞式通信-基于TCP协议与使用SocketAPI进行网络通信的方法很类似。在使用Socket进行通信时服务端使用ServerSocket监听连接;使用NIO,则使用ServerSocketChannel监听连接。对于非阻塞式的通信,通信的流程不变:文章目录使用NIO进行阻塞式通信-基于TCP协议服务端1. 创建`ServerSocketChannel`2. 绑定本地端口,开始监听3. 调用accept(),连接到客户端4. 通过`SocketChannel`进行通信5. 通信完成,关原创 2020-06-27 01:15:20 · 240 阅读 · 0 评论 -
Java注解
注解的本质自定义注解注解的解析原创 2020-02-19 18:38:24 · 232 阅读 · 0 评论 -
注解的解析
通过之前的学习,可以学会自定义一个注解。但是定义之后要怎么使用?运行时的注解对象注解本质上是一个接口,所以在运行时,会动态地生成一个实现了这个接口地类,并且将他实例化。怎么实现接口的方法?在使用注解时,如果注解有没有默认值的属性,则一定要给属性显式的赋值。所以,使用时,每个注解的属性都有确定的值。动态的实现这些方法时,只需要返回这些值即可举个例子:自定义注解:@Re...原创 2020-02-19 18:37:00 · 306 阅读 · 0 评论 -
自定义注解
如果要自定义一个注解,首先要明白注解怎样定义,也就是注解定义时的格式。先来看一个Spring框架的注解@Component。 可以看到,定义注解有两个关键点:元注解、方法(在注解中又叫属性)。注解的属性(接口中的方法)一直都在强调,注解的本质是接口,所以,它的内部可以声明方法,在注解中,这些方法又叫做属性。public @interface Test...原创 2020-02-19 18:15:26 · 174 阅读 · 0 评论 -
注解的本质与预定义注解
注解,是JDK 1.5的新特性。是代码级别的说明。代码级别是说注释参与编译器的编译阶段或者参与虚拟机的解释运行。注解用于说明代码,但是不同于注释。注释本身不是代码的一部分,在编译阶段就被忽略了,而注解是代码的一部分注解的本质为了了解注解的本质,首先来模仿@Override,定义一个最简单的注解。@Target(ElementType.METHOD)@Retention(Reten...原创 2020-02-19 15:54:32 · 280 阅读 · 0 评论 -
Java对象克隆
Java对象克隆Java提供了克隆的机制,Object类有clone方法,用于对象克隆。clone()和Cloneable接口Cloneable是一个用于标记的接口,接口没有任何声明方法clone()方法,是Object类定义的方法(protected),该方法会将对象的所有字段进行复制如果一个类没有实现Cloneable接口,并且它的实例调用了clone()方法,就会抛出异...原创 2019-12-18 11:56:15 · 165 阅读 · 0 评论 -
Java代理
Java代理 —— 动态代理有一个表示接口的Class对象,它的类型在运行阶段才能确定。想要实例化实现这个接口类,就需要动态的构建一个类动态构建类有下面两种方法:自动生成代码,然后调用编译器,然后再加载编译后的类。很显然效率不高Java的代理机制。下面,重点介绍一下Java的代理机制。补充知识在介绍完整内容之前,先介绍一下反射中的一些小知识。每一个方法,都可以用一个Method...原创 2019-12-14 22:00:57 · 126 阅读 · 1 评论 -
线程安全与JAVA“互斥锁”机制
线程安全与JAVA“互斥锁”机制1.多线程产生的问题首先来看一个例子:import java.io.IOException;class Counter extends Thread{ static int count = 0; @Override public void run() { for(int i = 0; i < 100...原创 2019-10-27 16:39:12 · 192 阅读 · 0 评论 -
线程间通信
线程间通信回忆进程间的通信,通过对一个资源的PV操作实现,对于线程来说,实现方式和进程是相同的,线程对互斥锁进行PV操作。wait()和notyfy()注意:这两个方法只能在synchronized代码块/方法中调用,否则会抛出异常。因为这两个方法是对互斥锁的PV操作,所以互斥锁必须存在,因此必须写在synchronized代码块/方法中wait- 当前线程释放互斥锁/对象锁/同...原创 2019-10-27 19:02:56 · 126 阅读 · 0 评论 -
线程管理
线程管理1.线程优先级java提供10种线程优先级,用整型数据表示1~10。可以通过线程的setPriority()方法设置优先级。注意:高优先级的线程不一定比低优先级先调度,还与操作系统有关2.线程让步线程让步通过静态方法Thread.yield()方法实现,这个方法会使当前线程让出CPU给不小于它的优先级的线程,这也是yield()与sleep()的不同,sleep()不会...原创 2019-10-26 21:12:50 · 142 阅读 · 0 评论 -
线程状态
线程状态线程的状态和进程的状态基本上一摸一样,所以这里不详细的描述线程状态转换图新建状态:主线程创建了子线程,但没有发送start()消息就绪状态:分配CPU就能执行运行状态:正在运行阻塞状态:线程进入阻塞队列,需要被唤醒才能进入就绪状态调用sleep()方法 调用join()方法 发出I/O请求 调用wait()方法死亡状态:线程正常运行并推出run(...原创 2019-10-26 20:48:49 · 184 阅读 · 0 评论 -
主线程和子线程
主线程和子线程主线程JAVA程序至少有一个线程——主线程。 主线程由JVM创建。 主线程的线程名是main。 主线程执行入口main(String[] args)。子线程子线程由主线程创建。 子线程的名称可以指定,也可以由JVM分配。 子线程自行入口run()。run()是Runnable接口的方法1.主线程和子线程之间的关系主线程负责管理由它创建的子线程,创建、启...原创 2019-10-26 20:33:25 · 1661 阅读 · 0 评论 -
JAVA多线程
主线程子线程 线程创建的两种方式——实现Runnable接口、继承Thread类线程状态线程管理 线程优先级、join()、线程让步yield()、线程停止线程安全 JAVA“互斥锁”机制保证线程安全线程通信 wait()和notify()...原创 2019-10-26 20:12:20 · 118 阅读 · 0 评论 -
通过JDBC了解服务提供者框架
通过JDBC了解服务提供者框架这篇博客引用了一些《Effective Java》书中的内容一.服务提供者框架组成及作用服务接口(Server Interface) 提供者注册API(Service Registration API) 服务提供者接口(Service Provider Interface) 服务访问API(Service Acess API)作用:服务接口:定...原创 2019-08-16 01:27:51 · 346 阅读 · 0 评论 -
JDBC简单入门教程
JDBC简单入门教程步骤:加载驱动 建立连接 发送SQL查询 得到结果 调用各个对象的close()方法加载驱动类:Java提供了JDBC的接口,数据库厂商负责实现接口(也就是驱动)。通过静态方法Class.forName()加载驱动类Class.forName("com.mysql.cj.jdbc.Driver");看了一些书和教程,由于版本的变化,驱动类所...原创 2019-04-24 16:17:19 · 103 阅读 · 0 评论