Java语言学习手记-线程初步.请高手指点

heart5 2003-06-18 03:48:25
Java语言学习手记-线程初步
2003-6-17 15:14
从前天开始看线程,概念倒觉得很好理解。线程可以相对独立运行,执行一定的任务,比同时执行几个进程稍微有所不同。但是在实际运用中出了不小的麻烦。
sun官方网站的教程中有Essential Java Classes 章节,其中有一节是Doing Two or More Tasks At Once: Threads 专门讲线程的。其中的例子是有关排序的,Applet在执行时获取参数决定使用哪一种排序方法,并用直观的方式(在Applet的Graphics对象上把被排序的数组以线条的方式画出来)显示排序过程。我想练一下手,计划在Applet上放置三个Canvas,分别动态显示三种排序方法的排序过程。但是因为完全没有掌握线程的具体用法,搞了三四天(实际时间超过了50个小时),今天才算基本弄好。
刚开始我的想法是新建一个BaiSortThread类,声明为Thread。但是因为动态显示的方法与算法类×××Algorithm、BaiSortAlgorithm、被画的对象BaiSortThread都有关联,没有办法调试。后来就把具体算法、算法接口、算法线程、显示对象又整理一下,使之功能尽量独立,并通过向算法线程传递画布、数组名称参数实现排序的正常运行。在Applet中用new创建新的BaiSortThread时出现错误,event dispatching error,NullPointer。
怎么样修改都不行。后来在网上找例子看后,决定调整思路。废掉BaiSortThread,改用BaiSortCanvas,并使之实现Runnable接口。创建时接受的参数尽量简单,只接受算法的名字、数组即可(Canvas不必传递,因为它自己本身就是Canvas)。在run()方法中创建线程使之调用算法接口和算法的方法进行排序。编译通过,运行成功。但是结果在HotJava和AppletViewer中显示正常,在IE中却无法正常显示,好像是Canvas的paint()方法无法执行。唉,算了,先松口气再说。

纵观本次程序调试,教训多多,经验可能只有一点,下面具体谈谈:
1、public数组变量声明后千万不要在private方法中赋值,最好在init()中把该具体化的具体化。如声明BaiSortCanvas[] baiCans;然后在一private void StartSort()中具体化,baiCans = new BaiSortCanvas[3];编译时顺利通过,执行时就出现了NullPointerError。
2、功能尽量独立,类之间调用时需要传递的参数尽可能少,类的功能尽量单一,需要中转变量就自己内部声明。我在试图向原来的BaiSortThread中传递的参数有4个,出了问题调试时真真是费了九牛二虎之力才找出原因。
3、妥善使用this、parent、super()。
4、设置调试变量public boolean debug=true;用System.out.println(" ");配合可以快速定位bug、大大加快调试速度。使用后者的显示语句时不要吝啬。另外try catch时不要懒,多用e.printStackTrace ();
5、使类可以运行有两种方法:extend Thread或者implements Runnable,推荐后者。具体语句如下
public void run() {
sorter = new Thread(){
public void run(){
try {
algorithm.init();
algorithm.sort(arofint);
} catch(Exception e) {
e.printStackTrace ();
}
}
};
sorter.start ();
}
内嵌的run()中执行的功能最好只与子类、已经声明并实例化的类相关,千万不要向parent或者super()要求东西。
6、java.awt中的compenent和container使用方法太原始,推荐swing(可惜我现在还没有学)。
...全文
62 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,407

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧