用JAVA实现多线程下载功能(2009-12-13 16:17)
这两天有空再看了《疯狂java讲义》中的socket编程的部分内容!通过URL和URLConnection工具类,我们利用URL对象的openStream()可以读取该URL资源的InputStream,通过该方法可以非常方便地读取远程资源---甚至实现多线程下载!
具体源代码如下
如有对下述代码理解不清楚的地方,可以随时在后面跟帖提问
import java.io.*;
import java.net.*;
//定义下载从start到end的内容的线程
class DownThread extends Thread
{
//定义字节数组(取水的竹筒)的长度
private final int BUFF_LEN = 32;
//定义下载的起始点
private long start;
//定义下载的结束点
private long end;
//下载资源对应的输入流
private InputStream is;
//将下载到的字节输出到raf中
private RandomAccessFile raf ;
//构造器,传入输入流,输出流和下载起始点、结束点
这两天,在jsp页面中用表达式语言中的$符号,如${pageScope.title}输出时,输不出内容还是${pageScope.title}原封不动的显示
但是事实上,通过在当前jsp页面运行下面代码,可以测试pageContext.getAttribute('title')是有值的
复制内容到剪贴板代码:
<%
...
pageContext.setAttribute('title',aboutusBean.getTitle());
System.out.println('pageContext='+pageContext.getAttribute('title'));
%>
怪了,这难道与我当前使用jquery框架有关?(jquery中也只是与js库之间冲突$符号啊)事实上,我在当前的jsp页面是根本没有使用jquery的js库的,也没有导入jquery的js文件,在其它jsp页面才使用的jquery的。。我原来的一些项目都用表达式语言的$符号挺好的。。问题,出在哪?奇怪了
后过,经过《疯狂java论坛》的站长kon
使用fckeditor中的一点小收获(2009-11-20 16:29)
前段时间,因为要在项目中要用到在线编辑器,就下载了这款支持java的fckeditor开源的在线编辑器,从目前的使用来看,整体感觉还不错..不过,在使用中发现fckeditor中默认带的字体只有英文字体,不带有中文字体,昨办?输入中文,没有中文字体来进行编辑那可不是一件令人高兴的事情了。。从网上搜了一下相关介绍,可惜说得都不是很具体,经本人测试了一下,发现加入中文字体是件比较容易的,这里,把它简单总结一下,免得没有用过的朋友走弯路,和朋友们分享一下!
第一步:新建一个properties文件,如2.perperties
(我是直接放在d盘根目录下)
在文件放入你需要中文字体,如
宋体;楷体_GB2312;新宋体;黑体;隶书;幼圆
奶奶去世留给我的思索和回忆(2009-11-14 23:33)
奶奶去世,我和老婆,大姐是在深圳机场坐最早的飞机回武汉的(2009年11月9号早晨7点钟左右,老家打来电话说奶奶刚去世,我早晨马上向单位请假,订机票,下午在深圳宝安机场坐2:30的飞机,到湖北监利何桥老家时已经是当天晚上10点多钟了),我在家一共呆了五天..心中有很多的感受,只可惜,我没有作家那样细腻的感情和流畅的文笔,不能够用文字来完整的表达我这几天来的亲身感受,这里我就只是用文字简单记录一下,以示我对奶奶的纪念!
秋天,历来是文人墨客喜欢有感而发的季节,这让我想起了《秋登宣城谢眺北楼》[唐]李白写的诗句“人烟寒橘柚,秋色老梧桐。谁念北楼上,临风怀谢公”
。在这样一个略带寒意的秋季,奶奶走完了她人生的第98个春秋。98岁,在老家算是高寿了,应该说是寿终正寝了。有奶奶在的时候,我们家是四世同堂!多少会让人有一些温馨的感觉!其实,奶奶能活到这么大年纪,没有我妈的悉心照顾,是不可能活到今天的。妈在街坊是出了名的孝顺的媳妇,尽管妈年轻刚嫁过来的时候,奶奶对妈很苛刻,但是在奶奶老年的时候,妈却对奶奶不计前嫌,奶奶晚年的时候,有时
Java中多线程系列自学笔记(5)(2009-11-02 13:40)
线程通信
当线程在系统内运行,线程的调度具有一定的透明性,程序通常无法准确控制线程的轮换执行,但我们可以通过一定的机制来保证线程的协调运行.
线程的协调运行
假设现在在系统中有两条线程,这两条线程分别取款者和存款者--现在假设系统有一种特殊的要求,系统要求存款者和取钱者不断重复存款,取款的动作,而且要求每当存款者将钱存入指定账户后,取钱者就立即取取该笔钱。不允许存款者连续两次存钱,也不允许取款者连续两次取钱。
为了实现这种功能,可以借助于Object类提供的wait(),notify(),notifyAll()三个方法,这三个方法不属于Thread类,而是属于Object类。这三个方法必须由同步监视器对象来调用,这可分成两种情况。但这三个方法必由同步监视器对象来调用,这可分成两种情况
Java中多线程系列自学笔记(4)(2009-11-02 09:40)
线程睡眠sleep
如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,可以通过Thread类的静态sleep方法,sleep方法有两种重载的形式
1.static void sleep(long
millis):让当前正在执行的线程暂停millis豪秒,并进入阻塞状态,该方法受到系统计时器和线程调度器的精度和准备度的影响。
2.static void sleep(long millis,int
nanos):这种用得少,就不介绍了
当当前线程调用sleep方法进入阻塞状态后,在其sleep时间段内,该线程不会获得执行的机会,即使系统中没有其它可运行的线程,处于sleep中的线程也不会运行,因此sleep方法常用来暂停程序的运行
下面的程序调用sleep方法来暂停主线程的执行,因为该线程只有一条主线程,当主线程进入sleep后,系统没有可执行的线程和,所以可以看到sleep处暂停
pu
Java中多线程系列自学笔记(3)(2009-11-01 22:45)
线程安全问题
在多线程并发访问共享资源时,会出现多个线程改变竟争资源,这时候若不加控制,就会出现数据不同步,可能有的线程已经改变了该共享资源,但其它线程中得到的共享资源依然没变,这样就会出现麻烦了。。比如说在银行取钱和存钱的操作流程,有多个人同时用同一个帐号去取钱,有的人在取款机上已经取了钱出来,但余额依然没有变,这样另一个人同时用同一个帐号取钱就会出错了。。
下面,我们两条线程来模拟取钱操作,模拟两个人用同一人帐户并发取钱的问题。
下面定义一个账户类,该账户类封装了账户编号和余额两个属性
public
class Account
{
//封装账户编号、账户余额两个属性
private String accountNo;
private double balance;
public Account(){}
//构造器
public Account(String accountNo , double b
Java中多线程系列自学笔记(2)(2009-10-31 16:10)
线程的生命周期
当线程被创建后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New),就绪(Runnable),运行(Running),阻塞(Blocked)和死亡(Dead)五种状态。特别是当线程启动以后,它不能一直“占用”着cpu资源独自运行,所以cpu需要在多条线程之间切换,于是线程状态就会多次在运行,阻塞之间切换。
当线程对象调用了start()方法之后,该线程就处于就绪状态,java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,它只是表示该线程可以运行了。至于该线程何时开始运行,取决于JVM里线程调度器的调度。
为了测试某条线程是否死亡,一般用isAlive()方法,当线程处于就绪,运行,阻塞三种状态时,该方法返回true,当线程处于
Java中多线程系列自学笔记(1)(2009-10-31 13:36)
在实际应用中,多线程是非常有用的,比如:一个浏览器必须能同时下载多个图片;
一个web服务器必须能同时响应多个用户的请求;Java虚拟机本身就在后台提供了一个超级线程来进行垃圾回收;图形用户户界面应用(GUI)也需要启动单独的线程来从主机环境收集用户界面事件...总之,多线程在实际的应用是非常广泛的。
多线程编程的包含如下几个优点:
(1).进程间不能共享内存,但线程之间共享内存非常容易
(2)系统创建进程需要为该进程重新分配系统资源,但创建线程则代价小得多,因此使用多线程来实现多任务并发比多进程的效率高。
(3)Java语言内置多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了Java的多线程编程
淡淡JDBC中的批量更新功能(2009-10-31 10:17)
由于阿堂在原来的老项目中,用jdbc操作时,用到了jdbc的批量操作,加上前段时间看《疯狂java讲义》时,也看到李刚作者的相关介绍。考虑还是会有人要用到jdbc的操作的,所以,阿堂还是把它整一下,就成了下面的文字了。用JDBC的DML语句时(insert,delete,update),我们可能可能需要同时某几个表都要进行DML操作,比如,当我们对A表插入的时候,同时也要对B表插入相关的记录,还要同时更新C表的关联记录,这样就会涉及到三条DML的sql语句,如果不用批量更新功能的话,我们就得单独去处理,效率相对就要低些了。。使用批量更新时,多条sql语句将会被作为一批操作被同时收集,并同时提交。值得注意的是,批量更新必须得到底层数据库的支持,可能通过DatabaseMetaData的supportBatchUpdates方法来查看底层数据库是否支持批量更新
//conn是Connection的类型
DatabaseMetaData dbmd=conn.getMetaData();
//若a为true则意味着该数据是支持批量更新的
boolean a=dbmd.su