📄 right6_1_2_2.htm
字号:
<html><head><title>JAVA编程语言</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><link rel="stylesheet" href="../../../css/text.css" type="text/css"></head><body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" ><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF"> <tr> <td valign="top"> <table width="90%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="#FFFFFF"> <tr> <td height="244" valign="top"> <p> <span class="pt9-black"><img src="../../../images/html/liti.gif" width="38" height="38" align="absbottom" title="例题"> <font color="000099">例6.1 通过继承类Thread构造线程体</font><br> class SimpleThread extends Thread {<br> public SimpleThread(String str) {<br> super(str); <font color="339900">//调用其父类的构造方法</font><br> }<br> public void run() { <font color="339900">//重写run方法</font><br> for (int i = 0; i < 10; i++) {<br> System.out.println(i + " " + getName());<font color="339900"><br> //打印次数和线程的名字</font><br> try {<br> sleep((int)(Math.random() * 1000));<font color="339900"><br> //线程睡眠,把控制权交出去</font><br> } catch (InterruptedException e) {}<br> }</span></p> <p class="pt9-black"> System.out.println("DONE! " + getName());<font color="339900"><br> //线程执行结束</font><br> }<br> }<br> public class TwoThreadsTest {<br> public static void main (String args[]) {<br> new SimpleThread("First").start();<br> <font color="339900">//第一个线程的名字为First</font><br> new SimpleThread("Second").start();<font color="339900"><br> //第二个线程的名字为Second</font><br> }<br> } </p> <p class="pt9-black"> 运行结果:<br> 0 First<br> 0 Second<br> 1 Second<br> 1 First<br> 2 First<br> 2 Second<br> 3 Second<br> 3 First<br> 4 First<br> 4 Second<br> 5 First<br> 5 Second<br> 6 Second<br> 6 First<br> 7 First<br> 7 Second<br> 8 Second<br> 9 Second<br> 8 First<br> DONE! Second<br> 9 First<br> DONE! First<br> <br> 仔细分析一下运行结果,会发现两个线程是交错运行的,感觉就象是两个线程在同时运行。但是实际上一台计算机通常就只有一个CPU,在某个时刻只能是只有一个线程在运行,而java语言在设计时就充分考虑到线程的并发调度执行。对于程序员来说,在编程时要注意给每个线程执行的时间和机会,主要是通过让线程睡眠的办法(调用sleep()方法)来让当前线程暂停执行,然后由其它线程来争夺执行的机会。如果上面的程序中没有用到sleep()方法,则就是第一个线程先执行完毕,然后第二个线程再执行完毕。所以用活sleep()方法是学习线程的一个关键。<br> </p> <span class="pt9-black"><img src="../../../images/html/liti.gif" width="38" height="38" align="absbottom" title="例题"> <font color="000099">例6.2 通过接口构造线程体</font><br> public class Clock extends java.applet.Applet implements Runnable {<font color="339900">//实现接口</font><br> Thread clockThread; <br> public void start() { <font color="339900"><br> //该方法是Applet的方法,不是线程的方法</font><br> if (clockThread == null) { <br> clockThread = new Thread(this, "Clock");<br> <font color="339900">/*线程体是Clock对象本身,线程名字为"Clock"*/</font><br> clockThread.start(); <font color="339900">//启动线程</font><br> }<br> } </span> <p class="pt9-black"> public void run() { <font color="339900">//run()方法中是线程执行的内容</font><br> while (clockThread != null) { <br> repaint(); //刷新显示画面<br> try { <br> clockThread.sleep(1000);<font color="339900"> <br> //睡眠1秒,即每隔1秒执行一次</font><br> } catch (InterruptedException e){} <br> } <br> } <br> <br> public void paint(Graphics g) { <br> Date now = new Date(); <font color="339900">//获得当前的时间对象</font><br> g.drawString(now.getHours() + ":" + now.getMinutes()+ ":" +now.getSeconds(), 5, 10);<font color="339900">//显示当前时间</font><br> }</p> <p class="pt9-black"> public void stop() {<br> <font color="339900">//该方法是Applet的方法,不是线程的方法</font><br> clockThread.stop(); <br> clockThread = null; <br> } <br> }<br> <br> 上面这个例子是通过每隔1秒种就执行线程的刷新画面功能,显示当前的时间;看起来的效果就是一个时钟,每隔1秒就变化一次。由于采用的是实现接口Runnable的方式,所以该类Clock还继承了Applet, Clock就可以Applet的方式运行。</p> <p class="pt9-black"> 构造线程体的两种方法的比较:<br> <br> <b>1. 使用Runnable接口</b><br> 1) 可以将CPU,代码和数据分开,形成清晰的模型;<br> 2) 还可以从其他类继承;<br> 3) 保持程序风格的一致性。<br> <br> <b>2. 直接继承Thread类</b><br> 1) 不能再从其他类继承;<br> 2) 编写简单,可以直接操纵线程,无需使用Thread.currentThread()。<br> </p> <p> <span class="pt9-black"><br> </span> </p> </td> </tr> </table> </td> </tr></table></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -