⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 right6_1_2_2.htm

📁 清华大学JAVA教程
💻 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 &lt; 10; i++) {<br>                  System.out.println(i + &quot; &quot; + 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(&quot;DONE! &quot; +               getName());<font color="339900"><br>                           //线程执行结束</font><br>                  }<br>                }<br>                public class TwoThreadsTest {<br>                 public static void main (String args[]) {<br>                  new SimpleThread(&quot;First&quot;).start();<br>                           <font color="339900">//第一个线程的名字为First</font><br>                  new SimpleThread(&quot;Second&quot;).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, &quot;Clock&quot;);<br>                     <font color="339900">/*线程体是Clock对象本身,线程名字为&quot;Clock&quot;*/</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() + &quot;:&quot; + now.getMinutes()+               &quot;:&quot; +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 + -