工作中遇到到了一个程序实例每次只能有一个实例访问,好好研究下代码没有思路,虎哥(很牛的专家)说有一个轻量级的jar包可以实现实例的互斥访问,下载源代码学习一下:
下面是学习笔记,与junique好似没有关系,算是java基础知识的巩固吧!
1、 获取类名字方法:
String id = CLASSNAME.class.getName();
2、 Java套接字编程知识点
服务端: 首先创建ServerSocket,负责接收客户连接请求。专门侦听多个客户端的连结请求。操作系统会把连结请求存储在一个先进先出的队列中,当队列请求达到最大量时候,拒绝新的连接请求。这时候服务端可以通过ServerSocket.accept方法从队列中取连接请求,使队列腾空。
客户端:通过使用Socket构造方法发送请求加入服务端的队列中;
ServerSocket.accept方法从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的socket对象,并将它返回。如果没有连接请求,accept方法就会一直等待,直到收到了连接请求才返回。接下来,服务端从socket对象获得输入流和输出流,就能与客户端进行通讯。
多线程服务器解决并发问题:为每个客户分配一个线程,创建一个线程池,由它来为客户服务。线程池中预先创建一些工作线程,他们不断的从工作队列中取出任务,然后执行任务。当工作线程执行完一个任务后,就会继续执行工作队列中的下一个任务。可以直接继承ThreadGroup实现线程池的创建。JDK类库提供了现成的包java.util.concurrent实现线程池,可以直接使用。
使用线程池的注意事项:
[l1](对于工作线程数目固定的线程池,如果工作线程在执行任务时抛出RuntimeException 或Error,并且这些异常或错误没有被捕获,那么这个工作线程就会异常终止,使得线程池永久失去了一个工作线程。如果所有的工作线程都异常终止,线程池就最终变为空,没有任何可用的工作线程来处理任务。 )
学习心得:
对一个大的工程,一定不要上来就进入研究代码细节,容易进入"只见树木,不见森林"的尴尬境地,要学习时下流行的工业标准和潮流,用设计模式的思维首先把工程的整个包研究下,可以在纸上划出各个类间的关系,然后研究它们之间的耦合性,多问几个为什么。以便对整个包有个概括性的了解,在这个基础上,再去深入研究优秀的开源代码中的精华才是一种不错的学习方法。
junique jar包学习过程经验有待于总结,并逐步养成好的习惯,要熟知包的接口,熟悉各个类间的依赖关系和耦合性,在此基础上研究代码中精华细节,junique 中核心api接口如下:
Method Summary | |
static void | acquireLock(java.lang.String id) This method tries to acquire a lock in the user-space for a given ID. |
static void | acquireLock(java.lang.String id, MessageHandler messageHandler) This method tries to acquire a lock in the user-space for a given ID. |
static void | releaseLock(java.lang.String id) It releases a previously acquired lock on an ID. |
static java.lang.String | sendMessage(java.lang.String id, java.lang.String message) It sends a message to the JVM process that has previously locked the given ID. |