王吉元-NWPU

导航

 

2014年1月4日

摘要: 看一个重载造成的恶果:List list=new ArrayList(); for(int i=-3;i<3;i++){ list.add(i); } for(int i=0;i<3;i++){ list.remove(i); } System.out.println(list);结果:[-2, 0, 2]神马情况?竟然不是[-3,-2,1]。原因就是List的remove方法有两个重载remove(E)和remove(int)。而remove(int)是删除第几个... 阅读全文
posted @ 2014-01-04 16:19 王吉元 阅读(130) 评论(0) 推荐(0) 编辑
 
摘要: 对象的运行时类型并不影响“哪个重载版本将被执行”;选择工作是在编译时候进行的,完全基于参数的编译时类型。看个例子先:package com.wjy.multithread;public class MainTest { public static void show(int a){ System.out.println("Integer"); } public static void show(double a){ System.out.println("Double"); } public static voi... 阅读全文
posted @ 2014-01-04 16:08 王吉元 阅读(418) 评论(0) 推荐(0) 编辑
 

2014年1月2日

摘要: import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; public class TopNTool { /** * String 转换 ByteBuffer * @param str * @return */ public static ByteBuffer getByteBuffer(String str) {... 阅读全文
posted @ 2014-01-02 14:51 王吉元 阅读(12457) 评论(1) 推荐(0) 编辑
 

2013年12月30日

摘要: 为了探索同步的特性做了些实验:package com.wjy.synchronize;public class MyThread implements Runnable{ @Override public void run() { // TODO Auto-generated method stub synchronized (this) { for(int i=0;i<10;i++){ try { Thread.sleep(1000); ... 阅读全文
posted @ 2013-12-30 16:45 王吉元 阅读(184) 评论(0) 推荐(0) 编辑
 
摘要: 最近看了一个描述同步的很好比喻,分享一下:打个比方:一个object就像一个大房子,大门永远打开。房子里有 很多房间(也就是方法)。这些房间有上锁的(synchronized方法), 和不上锁之分(普通方法)。房门口放着一把钥匙(key),这把钥匙可以打开所有上锁的房间。另外我把所有想调用该对象方法的线程比喻成想进入这房子某个 房间的人。所有的东西就这么多了,下面我们看看这些东西之间如何作用的。在此我们先来明确一下我们的前提条件。该对象至少有一个synchronized方法,否则这个key还有啥意义。当然也就不会有我们的这个主题了。一个人想进入某间上了锁的房间,他来到房子门口,看见钥匙在那儿( 阅读全文
posted @ 2013-12-30 16:14 王吉元 阅读(156) 评论(0) 推荐(0) 编辑
 
摘要: 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。package com.wjy.synchronize;public class MyThread implements Runnable{ @Override public void run() { // TODO Auto-generated method stub synchronized (this) { for(int i=0... 阅读全文
posted @ 2013-12-30 16:13 王吉元 阅读(280) 评论(0) 推荐(0) 编辑
 

2013年12月29日

摘要: 状态迁移1. SO_LINGER/ SO_REUSEADDR TCP正常的关闭过程如下(四次握手过程):(FIN_WAIT_1) A ---FIN---> B(CLOSE_WAIT)(FIN_WAIT_2) A B(CLOSED) Ø A端首先发送一个FIN请求给B端,要求关闭,发送后A段的TCP状态变更为FIN_WAIT_1,接收到FIN请求后B端的TCP状态变更为CLOSE_WAIT Ø B接收到ACK请求后,B回一个ACK给A端,确认接收到的FIN请求,接收到ACK请求后,A端的TCP状态变更为为FIN_WAIT_2。 Ø B端再发... 阅读全文
posted @ 2013-12-29 22:46 王吉元 阅读(1564) 评论(0) 推荐(0) 编辑
 
摘要: Java提供了一个很好地类来实现1中的线程池功能就是Executors类。将服务端代码改变一下就OK了。当然了,ReceiveFile类还需要改变一下(实现一个Runnable接口,并将receiveFile方法的内容写到run方法中,删除receiveFile方法即可)。package com.wjy.threadpool;import java.io.BufferedInputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.con.. 阅读全文
posted @ 2013-12-29 16:12 王吉元 阅读(180) 评论(0) 推荐(0) 编辑
 
摘要: 服务端处理客户端的请求,对于Socket采用TCP连接的手段来说,由于一个SocketServer只对应和一个Socket通信。所以,为了有效的控制服务端的服务质量,采取线程池的策略。集体说来就是开启若干个SocketServer来对预想连接到服务器的客户端们进行处理,若是同一时间有很多客户端涌入,线程池中的ServerSocket都不够用了都被占用了,则多余的那些客户端就先等待,等有的ServerSocket执行完之后再来和他们通信处理。具体的最简单的线程池实现如下代码所示(每个ServerSocket实现了接受文件的任务,而假想很多客户端涌入要求向服务端传输文件):package co.. 阅读全文
posted @ 2013-12-29 15:26 王吉元 阅读(292) 评论(0) 推荐(0) 编辑
 

2013年12月26日

摘要: 1.写了一个socket传输文件的程序,发现传输过去文件有问题。找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决了问题。 个人认为可能是传输过程中,接收端向磁盘写速度有点慢,被后面的覆盖导致错误。//---------------------------------------------------------------------------------------------------------------... 阅读全文
posted @ 2013-12-26 22:22 王吉元 阅读(1182) 评论(0) 推荐(1) 编辑