现在的位置: 首页 > 综合 > 正文

java利己线程

2018年05月09日 ⁄ 综合 ⁄ 共 1545字 ⁄ 字号 评论关闭

所谓利己线程,就是在运行时不考虑其它线程的运行权限和时间分配,一心只顾自己运行完成了事的这种线程,比如:while(true){............}
但是,如果{..........}的代码中要调用一些资源,就一定要sleep,让资源有空闲的时间来让本线程获取,也许这些资源不是当前线程一方要求调用,但无论如何要空闲一定的时间,即使资源空闲下来时本线程只能调用很少一部份,不然真的就死锁了.
 
在图形编程中,加载一个图形是异步的,然后组件会调用观察类ImageObserver来不断让图形加载和显示进行更新直到完成.因为图形组件的顶级对象 Component 已经实现ImageObserver,所以一般来说如果要加载一个Image,只要在drawImage方法中调用this(自己)作为观察者就行.
 
但是,如果我们要把一个源图象缩放后输出,或把多个源图象合并成一个图象输出(图形计数器就是把很多种0-9的数字图片合并成一个图片)输出,那就是在内存中先生生成一个BufferedImage对象,然后把源图象draw到BufferedImage的一定位置,再把BufferedImage编码输出到一个输出流如文件或网页.因为drawImage是BufferedImage的Graphics对象调用的,一切都在内存中而根本没有可视组件,所以根本没有观察者对象,而MediaTracker对象同样要求一个组件对象构造,在这种时候也没法调用.
 
 
BufferedImage bi = new BufferedImage(目标宽,目标高,BufferedImage.TYPE_INT_RGB);
Graphics2D g =(Graphics2D)image.getGraphics();
Image src = Toolkit.getDefaultToolkit().getImage("d:/aaa.jpg");
不管你的src原来是多大,只要你draw时设定大小,就会以你设定的大小画到目标bi上,这就是
缩略图或合成图的方法.但在g.drawImage(src,坐标x,坐标y,宽,高,观察者);调用时,因为没有一个观察者实例,一次调用99%不会成功.所以我是这样调用的:
while (!(flag=g.drawImage(src, 0, 0, 240, 320, null))) ;
大家注意是如果flag为flase就只有一个";"也就是什么也不做直接进入下一次循环.
我试过一般画一张新图要10多秒,如果是生成计数器,这在servlet中根本不行.没有人愿意用10秒的时间等一个计数器出来.后来我想让这个servlet实现观察者.就在
while (!(flag=g.drawImage(src, 0, 0, 240, 320, null))) {
 
}
中调试它每次getWidth(null)的log并打印出来,结果发现如果改成
    while (!(flag=g.drawImage(src, 0, 0, 240, 320, null))) {
    System.out.println(src.getWidth(null));
}
却只要200MS,0.2秒左右就完成了.原来,System.out时要调用BIOS的资源,这时线程要闲置等待,到反而让src资源有了load的时间.于是改成:
    while (!(flag=g.drawImage(src, 0, 0, 240, 320, null))) {
    Thread.currentThread().sleep(1);
}
哈哈,成功了.sleep时1,5,10MS没有多大区别,都在200MS左右完成,一般不要再睡更多的时间.
 
所以即使是利己线程的也要看它是否对其它资源的请求,真的应了那句话叫"予人方便,于己方便!"

【上篇】
【下篇】

抱歉!评论已关闭.