所谓利己线程,就是在运行时不考虑其它线程的运行权限和时间分配,一心只顾自己运行完成了事的这种线程,比如: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左右完成,一般不要再睡更多的时间.

所以即使是利己线程的也要看它是否对其它资源的请求,真的应了那句话叫"予人方便,于己方便!"

java利己线程_java利己线程 | 学步园相关推荐

  1. java个人所得税计算_java个人所得税计算器 | 学步园

    class Caculate{ private String name; private double money; private double actual; /** * @param usern ...

  2. java迭代器 异常_java迭代器失效 | 学步园

    今天在测试代码的时候出现一个异常ConcurrentModificationException,该异常网上很多解决方案以及解释,但我还是再记录一遍吧. 代码抽象出来是这样的: import java. ...

  3. Java点名分类_java实现点名 | 学步园

    java实现点名,在文本中每行存一个名字. import java.io.File; import java.io.FileInputStream; import java.util.ArrayLis ...

  4. java 线程组和线程_Java多线程 线程组原理及实例详解

    线程组 线程组可以批量管理线程和线程组对象. 一级关联 例子如下,建立一级关联. public class MyThread43 implements Runnable{ public void ru ...

  5. java 线程中创建线程_java – 在线程中创建线程 – 良好的做​​法?

    参见英文答案 > Threads within threads in Java?                                    4个 在线程中启动线程是一种好习惯吗?我搜 ...

  6. java中断线程_Java中断线程的方法

    使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回.这 ...

  7. java阻塞超时_JAVA防线程阻塞(超时控制)

    2.[代码]TimeoutThread /** * java线程超时控制的实现 * * 超时控制一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序超时后, 往往需要 ...

  8. java自定义线程_Java自定义线程池详解

    自定义线程池的核心:ThreadPoolExecutor 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制,其中在java.util.concurrent ...

  9. java 多线程池_Java ThreadPoolExecutor线程池 同时执行50个线程

    最近项目上有个需求,需要从FTP服务器中下载大批量的数据文件,然后解析该数据文件进行入库,数据库为oracle,最后在通过web工程,以报表和图表的形式进行展现. 这些批量的数据文件为纯文本文件,每天 ...

  10. java 添加等待时间_Java中线程等待特定时间的最有效方法 - java

    我知道这个问题here,但是我有一个稍微不同的问题.如果我希望自己通过各种Thread方法(而不是通过实用程序类或Quartz)手动编码某个线程在特定时间的运行,那么最有效(就开销而言)进行编码. 我 ...

最新文章

  1. IOS开发知识(七)
  2. 你什么时候觉得自己会被边缘化?
  3. Scala学习第五天数组
  4. python闭包、装饰器
  5. 路由控制器Express的路由控制方法
  6. 投标报价得分计算程序_什么是投标报价?怎么计算呢?
  7. 工具类集和_gblfy版本
  8. php 类分开写,自己前几天写的无限分类类_PHP教程
  9. Xamarin和Java开发安卓_将原生移动开发与Xamarin相结合
  10. 在java中生成二维码,并直接输出到jsp页面
  11. Quora 用了哪些技术 ?(zz)
  12. 图网络深度解析:为什么说图网络是 AI 的未来?
  13. 跟着团子学SAP PS:项目版本管理-项目模拟功能(CJV1/CJV2/CJV3/CJV4)
  14. 反其道而行 - 登录gitbub
  15. 计算机网络 期末复习
  16. 士兵 POJ1723
  17. nvcc(CUDA编译器)
  18. 机器学习编译MLC 笔记 1-5章(上)
  19. 齐鲁工业大学计算机应用技术研究生专业,研究生培养
  20. mac电脑如何删除其他python版本的包

热门文章

  1. 论文翻译——Lattice indexing for spoken term detection
  2. [NOIp2017] 时间复杂度
  3. (转)Vue-初步了解vue-router的三要素:路由map 、路由视图、路由导航
  4. Ember.js之动态创建模型
  5. php中curl、fsockopen的应用
  6. 搜狗浏览器数据备份/同步工具
  7. java long类型报错:error: integer number too large
  8. OpenGL ES简介(一)
  9. tensorflow之预测手写字的概率
  10. 电源-主动式PFC介绍