Samuel Learning
联系
管理
文章分类
(203)
01 ASP/HTML(6)
02 Script/CSS(16)
03 C/C++
04 XML(4)
05 微软编程(26)
06 J2EE(60)
09 Linux(14)
10 Database(27)
11 报表打印
12 打包安装(1)
13 模式重构(2)
14 系统架构
15 敏捷开发(11)
16 案例分析(30)
17 Workflow(1)
18 配置管理(1)
19 项目管理
20 英语(4)
新闻分类
(52)
CXF学习
Hibernate学习(1)
iBatis学习(16)
Struts1学习(1)
Struts2学习(34)
.NET资源
adxmenu
C# Open Source
DNN Directory
M2Land
Windows Form FAQ
中国DNN
中国DNN联盟
Ajax
DoJo
GWT
JQuery
jquery autocomplete
jquery flexgrid
JQuery Form
jquery masked input
JQuery UI
jquery validation
Jquery 图表
jquery报表
jquery插件集合
Qooxdoo
Tibco GI
YUI
YUI-EXT
ZeroKode
Java开源
ABLE
Agile Tao
Ajax4JSF
Alfresco
AppFuse
Compiere
Equinox
Findbugs
Geronimo
Grails
Harmony
Hibernate论坛
JAG
Java开源大全
Java视线论坛
jBPM工作流
JSFTutorials
Nereide ERP
Ofbiz ERP
Opentaps ERP
operamasks
Petstore
Prototype.js
RIFE
Runa
SpringSide
Struts Menu
Sun Glassfish
Trails
YUI4JSF
满江红
Mobile
Sencha
WEB资源
DHTML中心
DHTML参考手册
DHTML文档
EclipsePlugin
Firebug
GRO Clinux
jMaki
JSTL文档
LoadIcon
Openlaszlo
Struts Menu 展示
Web Test Tools
WebCtrs
Webdeveloper
中国RIA开发者论坛
Workflow
E-Workflow
JBPM
OpenWFE
OSWorkflow
WFMC
Workflow Research
其他连接
confach
CPP
ejay
Giovanni
丹佛
交大e-learning
交大研究生院
可恶的猫
天天@blog
我的相册
阿飞
大牛人
32篇JBPM
David.Turing
HongSoft@业务集成
Joel
Koen Aers
Martinfowler
Raible Matt
Raible Wiki
Scott W.Ambler
Tom Baeyens
Uncle Bob
一个世界在等待
子在川上曰
小布老师
小明
差沙
徐昊
江南白衣
汪博士
汪小金
银狐999
开源软件
2Bizbox ERP
CompiereCRM&ERP
EGW
Vtiger CRM
webERP
敏捷
Canoo
Cruisecontrol
DBUnit
EL4Ant
Extreme Programming
Fit
Fitnesse
JFrog
Liquibase
Maven
MockObjects
Selenium
Squish
xpairtise
XPlanner
XProgramming
敏捷联盟
数据库
Oracle 中国
Oracle-ERP
Oracle在线社区
未归类
Aquarius Orm Studio
mambo建站系统
Oracle产品下载
远程同步管理工具Capivara
经典框架
Apache Shale
formdef-struts
FreeMarker 主页
JBoss Seam
JSF 中心
JSF 入门应用
JSF中国
MyFaces官方
Spring 社区
Spring专业网站
Spring中文论坛
Spring参考手册
Spring官方网站
strecks-struts
Struts1
Struts2
Struts-layout
StrutsWiKi
Tapestry WIKI
Tapestry 官方
Tapestry4开发指南
Tapestry中文文档
Webwork2文档
Wicket
网络教程
Laliluna
RoseIndia
Sang Shin
Visualbuilder
著名站点
Buildix
Dev2Dev
IBM dev中国
InfoQ
ITPub
Java Eye
Java Research
JavaRead
JavaWorldTW
Matrix
PHP100
PHPX
SpringSideWiKi
TheServerSide
TWPHP
中国工作流论坛
项目管理
管理人网
最新评论
View Post
如何使用线程
Java平台从开始就被设计成为多线程环境。在你的主程序执行的时候,其它作业如碎片收集和事件处理则是在后台进行的。本质上,你可以认为这些作业是线程。它们正好是系统管理线程,但是无论如何,它们是线程。线程使你能够定义相互独立的作业,彼此之间互不干扰。系统将交换这些作业进或出CPU,这样(从外部看来)它们好象是同时运行的。
在你需要在你的程序中处理多个作业时,你也可以使用多个进程。这些进程可以是你自己创建的,你也可以操纵系统线程。
你进行这些多作业处理,要使用几个不同的类或接口:
java.util.Timer类
javax.swing.Timer类
Thread类
Runnable接口
对于简单的作业,通常需要重复的,你可以使用java.util.Timer类告诉它“每半秒钟做一次”。注意:大多数系统例程是使用毫秒的。半秒钟是500毫秒。
你希望Timer实现的任务是在java.util.TimerTask实例中定义的,其中运行的方法包含要执行的任务。这些在Hi类中进行了演示,其中字符串“Hi”重复地被显示在屏幕上,直到你按Enter键。
import java.util.
*
;
public
class
Hi
{
public
static
void
main(String args[])
throws java.io.IOException
{
TimerTask task
=
new
TimerTask()
{
public
void
run()
{
System.
out
.println(
"
Hi
"
);
}
}
;
Timer timer
=
new
Timer();
timer.schedule(task,
0
,
500
);
System.
out
.println(
"
Press ENTER to stop
"
);
System.
in
.read(
new
byte
[
10
]);
timer.cancel();
}
}
Java Runtime Environment工作的方式是只要有一个线程在运行,程序就不退出。这样,当取消被调用,没有其它线程在运行了,则程序退出。有一些系统线程在运行,如碎片收集程序。这些系统线程也被称为后台线程。后台线程的存在不影响运行环境被关闭,只有非后台线程保证运行环境不被关闭。
Javax.swing.Timer类与java.util.timer类的工作方式相似,但是有一些差别需要注意。第一,运行的作业被ActionListener接口的实现来定义。第二,作业的执行是在事件处理线程内部进行的,而不象java.util.Timer类是在它的外部。这是很重要的,因为它关系到Swing组件集是如何设计的。
如果你不熟悉Swing,它是一组可以被Java程序使用的图形组件。Swing被设计程被称为单线程的。这意味着对Swing类内部内容的访问必须在单个线程中完成。这个特定的线程是事件处理线程。这样,例如你想改变Label组件的文字,你不能仅仅调用Jlabel的setText方法。相反,你必须确认setText调用发生在事件处理线程中,而这正是javax.swing.Time类派的上用场的地方。
为了说明这第二种情况,下面的程序显示一个增加的计数器的值。美半秒钟计数器的数值增加,并且新的数值被显示。
import javax.swing.
*
;
import java.awt.
*
;
import java.awt.
event
.
*
;
public
class
Count
{
public
static
void
main(String args[])
{
JFrame frame
=
new
JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane
=
frame.getContentPane();
final JLabel label
=
new
JLabel(
""
, JLabel.CENTER);
label.setFont(
new
Font(
"
Serif
"
, Font.PLAIN,
36
));
contentPane.add(label, BorderLayout.CENTER);
ActionListener listener
=
new
ActionListener()
{
int
count
=
0
;
public
void
actionPerformed(ActionEvent e)
{
count
++
;
label.setText(Integer.toString(count));
}
}
;
Timer timer
=
new
Timer(
500
, listener);
timer.start();
frame.setSize(
300
,
100
);
frame.show();
}
}
上述程序的结果是:
万一你要做的不是一个简单的重复作业,java.lang.Thread类就派上了用场。它允许你自己控制基本功能。通过创建Thread的一个子类,你可以使你的系统脱离,并进行一个长时间运行的作业,如从网络上读取一个文件,而不阻碍你的其它程序的运行。这种长时间运行的作业将在run方法中定义。
第二种方式是创建Thread类的子类并在子类中实现run方法,或在实现runnable的类中实现run方法,并将这个实现传递给Thread的构造函数。
你可能会问有什么区别。Java编程语言仅支持单一继承。如果你设计的调用是除了Thread以外的其它类,你可以是你的类实现Runnable,而它可以是你的作业被执行。否则,你定义Thread的子类来运行你的Run方法,在处理过程中不再添加其它操作。
对于创建Thread子类的第三种情况,下面的程序生成了一个新的线程来计算一个特定URL的字符数,这个URL是通过命令行传递进来的。在这进行过程之中,实现Runnable的第四种情况被演示,打印出重复的消息。注意在实现Runnable的这后一种情况下,你必须提供重复消息的代码。你必须同时sleep,以分配时间并完成操作。在两种情况下,与使用Timer相比较。这段程序的最后一部分包含有你从命令行读取命令以触发程序结束。注意在系统读取URL并打印消息的同时,你总可以按Enter键结束程序。
import java.io.
*
;
import java.net.
*
;
public
class
Both
{
public
static
void
main(String args[])
{
final String urlString
=
args[
0
];
final String message
=
args[
1
];
Thread thread1
=
new
Thread()
{
public
void
run()
{
try
{
URL url
=
new
URL(urlString);
URLConnection connection
=
url.openConnection();
InputStreamReader isr
=
new
InputStreamReader(
connection.getInputStream());
BufferedReader reader
=
new
BufferedReader(isr);
int
count
=
0
;
while
(reader.read()
!=
-
1
)
{
count
++
;
}
System.
out
.println(
"
Size is :
"
+
count);
reader.close();
}
catch
(MalformedURLException e)
{
System.err.println(
"
Bad URL:
"
+
urlString);
}
catch
(IOException e)
{
System.err.println(
"
I/O Problems
"
);
}
}
}
;
thread1.start();
Runnable runnable
=
new
Runnable()
{
public
void
run()
{
while
(
true
)
{
System.
out
.println(message);
try
{
Thread.sleep(
500
);
}
catch
(InterruptedException e)
{
}
}
}
}
;
Thread thread2
=
new
Thread(runnable);
thread2.start();
try
{
System.
out
.println(
"
Press ENTER to stop
"
);
System.
in
.read(
new
byte
[
10
]);
}
catch
(IOException e)
{
System.
out
.println(
"
I/O problems
"
);
}
System.exit(
0
);
}
}
因为有多种方式来处理线程,你选用哪种技术取决于你和你面临的条件。要成为一个有效的Java编程人员,尽管你通常不必学习Java编程语言的所有内容和核心库,但是线程是一个例外。你越早了解线程如何工作和如何使用线程,你将越早了解Java程序如何工作和交互。
posted on 2005-07-16 21:16
MingIsMe
阅读(95)
评论(0)
编辑
收藏
所属分类:
06 J2EE