﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java something-随笔分类-多线程</title><link>http://www.blogjava.net/santicom/category/49501.html</link><description>不要以为......很遥远</description><language>zh-cn</language><lastBuildDate>Fri, 16 Sep 2011 05:30:58 GMT</lastBuildDate><pubDate>Fri, 16 Sep 2011 05:30:58 GMT</pubDate><ttl>60</ttl><item><title>控制3个线程运行顺序的Demo</title><link>http://www.blogjava.net/santicom/archive/2011/09/02/357783.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 01 Sep 2011 18:27:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/09/02/357783.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/357783.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/09/02/357783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/357783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/357783.html</trackback:ping><description><![CDATA[<p><span style="font-family: Comic Sans MS">本程序可以控制3个线程按顺序执行， 代码如下：</span><br /><br /><span style="font-family: Comic Sans MS">public class Test3 {</span></p>
<p><span style="font-family: Comic Sans MS">&nbsp;public static void main(String[] args) throws IOException {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;final Test obj = new Test();</span><br />&nbsp;&nbsp;<br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;new Thread()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;public void run()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;obj.m1();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}.start();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;new Thread()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;public void run()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;obj.m2();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}.start();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;new Thread()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;public void run()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;obj.m3();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}.start();</span><br />&nbsp;&nbsp;<br /><span style="font-family: Comic Sans MS">&nbsp;}</span></p>
<p><span style="font-family: Comic Sans MS">}</span></p>
<p><span style="font-family: Comic Sans MS">class Test</span><br /><span style="font-family: Comic Sans MS">{</span><br /><span style="font-family: Comic Sans MS">&nbsp;static int count;</span><br /><span style="font-family: Comic Sans MS">&nbsp;volatile int target = 1;</span><br /><span style="font-family: Comic Sans MS">&nbsp;synchronized void m1()</span><br /><span style="font-family: Comic Sans MS">&nbsp;{&nbsp;</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 10; i++)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;while (target == 2 || target == 3)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (InterruptedException e) {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("m1() =" + i);</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;target = 2;</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;notifyAll();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;}</span><br />&nbsp;<br /><span style="font-family: Comic Sans MS">&nbsp;synchronized void m2()</span><br /><span style="font-family: Comic Sans MS">&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;for (int i = 0; i &lt; 10; i++)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;while (target == 1 || target == 3)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;try {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;} catch (InterruptedException e) {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;System.out.println("m2() =" + i);</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;target = 3;</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;notifyAll();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;}</span><br />&nbsp;<br /><span style="font-family: Comic Sans MS">&nbsp;synchronized void m3()</span><br /><span style="font-family: Comic Sans MS">&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;for (int i = 0; i &lt; 10; i++)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;while (target == 1 || target == 2)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;try {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;} catch (InterruptedException e) {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;System.out.println("m3() =" + i);</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;target = 1;</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;notifyAll();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;}</span><br /><span style="font-family: Comic Sans MS">}</span></p><img src ="http://www.blogjava.net/santicom/aggbug/357783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2011-09-02 02:27 <a href="http://www.blogjava.net/santicom/archive/2011/09/02/357783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程的同步与共享</title><link>http://www.blogjava.net/santicom/archive/2011/09/02/357778.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 01 Sep 2011 17:38:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/09/02/357778.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/357778.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/09/02/357778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/357778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/357778.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 线程的同步与共享前面程序中的线程都是独立的、异步执行的线程。但在很多情况下，多个线程需要共享数据资源，这就涉及到线程的同步与资源共享的问题。1&nbsp;资源冲突下面的例子说明，多个线程共享资源，如果不加以控制可能会产生冲突。程序CounterTest.java&nbsp;Code highlighting produced by Actipro CodeHighlight...&nbsp;&nbsp;<a href='http://www.blogjava.net/santicom/archive/2011/09/02/357778.html'>阅读全文</a><img src ="http://www.blogjava.net/santicom/aggbug/357778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2011-09-02 01:38 <a href="http://www.blogjava.net/santicom/archive/2011/09/02/357778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程的状态与调度</title><link>http://www.blogjava.net/santicom/archive/2011/09/01/357765.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 01 Sep 2011 13:43:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/09/01/357765.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/357765.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/09/01/357765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/357765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/357765.html</trackback:ping><description><![CDATA[<h3><span lang="EN-US"><font face="Times New Roman"><span>&nbsp; </span>1,</font></span><span>线程的生命周期</span></h3>
<p style="margin-right: 0px" dir="ltr"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;线程从创建、运行到结束总是处于下面五个状态之一：新建状态、就绪状态、运行状态、阻塞状态及死亡状态。</p>
<p style="margin-right: 0px" dir="ltr"><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/santicom/360截图20110901211600850.jpg" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;1.新建状态(New)：&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当用new操作符创建一个线程时， 例如new Thread(r)，线程还没有开始运行，此时线程处在新建状态。 当一个线程处于新生状态时，程序还没有开始运行线程中的代码<br /><br /><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.就绪状态</span><span lang="EN-US">(Runnable)</span></font></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个新创建的线程并不自动开始运行，要执行线程，必须调用线程的</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法。当线程对象调用</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法即启动了线程，</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法创建线程运行的系统资源，并调度线程运行</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法。当</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法返回后，线程就处于就绪状态。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;处于就绪状态的线程并不一定立即运行</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法，线程还必须同其他线程竞争</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间，只有获得</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间才可以运行线程。因为在单</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>的计算机系统中，不可能同时运行多个线程，一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>运行时系统的线程调度程序</span><span lang="EN-US"><font face="Times New Roman">(<em>thread scheduler</em>)</font></span><span>来调度的。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;3.<font face="Times New Roman"><span>运行状态</span><span lang="EN-US">(Running)</span></font></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>当线程获得</span><span lang="EN-US">CPU</span><span>时间后，它才进入运行状态，真正开始执行</span><span lang="EN-US">run()</span><span>方法.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="Times New Roman"><span lang="EN-US">4. </span><span>阻塞状态</span><span lang="EN-US">(Blocked)</span></font></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;线程运行过程中，可能由于各种原因进入阻塞状态:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&gt;线程通过调用sleep方法进入睡眠状态；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&gt;线程调用一个在I/O上被阻塞的操作，即该操作在输入输出操作完成之前不会返回到它的调用者；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&gt;线程试图得到一个锁，而该锁正被其他线程持有；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&gt;线程在等待某个触发条件；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所谓阻塞状态是正在运行的线程没有运行结束，暂时让出</span><span lang="EN-US">CPU</span><span>，这时其他处于就绪状态的线程就可以获得</span><span lang="EN-US">CPU</span><span>时间，进入运行状态。<br /><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;5. </span><span>死亡状态</span><span>(Dead)</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有两个原因会导致线程死亡：<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1) run方法正常退出而自然死亡，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2) 一个未捕获的异常终止了run方法而使线程猝死。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了确定线程在当前是否存活着（就是要么是可运行的，要么是被阻塞了），需要使用isAlive方法。如果是可运行或被阻塞，这个方法返回true； 如果线程仍旧是new状态且不是可运行的， 或者线程死亡了，则返回false.<br /><br /><br /><br /><br /></p>
<h3><span lang="EN-US"><font face="Times New Roman">2,<span>&nbsp; </span></font></span><span>线程的优先级和调度</span></h3>
<p><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>的每个线程都有一个优先级，当有多个线程处于就绪状态时，线程调度程序根据线程的优先级调度线程运行。</span></p>
<p><span>可以用下面方法设置和返回线程的优先级。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#183;<span>&nbsp;</span></span><span lang="EN-US"><font face="Times New Roman">public final void setPriority(int newPriority) </font></span><span>设置线程的优先级。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#183;<span>&nbsp;</span></span><span lang="EN-US"><font face="Times New Roman">public final int getPriority() </font></span><span>返回线程的优先级。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">newPriority</font></span><span>为线程的优先级，其取值为</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span>到</span><span lang="EN-US"><font face="Times New Roman">10</font></span><span>之间的整数，也可以使用</span><span lang="EN-US"><font face="Times New Roman">Thread</font></span><span>类定义的常量来设置线程的优先级，这些常量分别为：</span><span lang="EN-US"><font face="Times New Roman">Thread.MIN_PRIORITY</font></span><span>、</span><span lang="EN-US"><font face="Times New Roman">Thread.NORM_PRIORITY</font></span><span>、</span><span lang="EN-US"><font face="Times New Roman">Thread.MAX_PRIORITY</font></span><span>，它们分别对应于线程优先级的</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span>、</span><span lang="EN-US"><font face="Times New Roman">5</font></span><span>和</span><span lang="EN-US"><font face="Times New Roman">10</font></span><span>，数值越大优先级越高。当创建</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>线程时，如果没有指定它的优先级，则它从创建该线程那里继承优先级。</span></p>
<p><span>一般来说，只有在当前线程停止或由于某种原因被阻塞，较低优先级的线程才有机会运行。</span></p>
<p><span>前面说过多个线程可并发运行，然而实际上并不总是这样。由于很多计算机都是单</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>的，所以一个时刻只能有一个线程运行，多个线程的并发运行只是幻觉。在单</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>机器上多个线程的执行是按照某种顺序执行的，这称为线程的调度</span><span lang="EN-US"><font face="Times New Roman">(<em>scheduling</em>)</font></span><span>。</span></p>
<p><span>大多数计算机仅有一个</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>，所以线程必须与其他线程共享</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>。多个线程在单个</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>是按照某种顺序执行的。实际的调度策略随系统的不同而不同，通常线程调度可以采用两种策略调度处于就绪状态的线程。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">(1) </font></span><span>抢占式调度策略</span></p>
<p><span lang="EN-US"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>Java</font></span><span>运行时系统的线程调度算法是抢占式的</span><span lang="EN-US"><font face="Times New Roman"> (<em>preemptive</em>)</font></span><span>。</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>运行时系统支持一种简单的固定优先级的调度算法。如果一个优先级比其他任何处于可运行状态的线程都高的线程进入就绪状态，那么运行时系统就会选择该线程运行。新的优先级较高的线程抢占</span><span lang="EN-US"><font face="Times New Roman">(<em>preempt</em>)</font></span><span>了其他线程。但是</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>运行时系统并不抢占同优先级的线程。换句话说，</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>运行时系统不是分时的</span><span lang="EN-US"><font face="Times New Roman">(time-slice)</font></span><span>。然而，基于</span><span lang="EN-US"><font face="Times New Roman">Java Thread</font></span><span>类的实现系统可能是支持分时的，因此编写代码时不要依赖分时。当系统中的处于就绪状态的线程都具有相同优先级时，线程调度程序采用一种简单的、非抢占式的轮转的调度顺序。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">(2) </font></span><span>时间片轮转调度策略</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;有些系统的线程调度采用时间片轮转</span><span lang="EN-US">(round-robin)</span><span>调度策略。这种调度策略是从所有处于就绪状态的线程中选择优先级最高的线程分配一定的</span><span lang="EN-US">CPU</span><span>时间运行。该时间过后再选择其他线程运行。只有当线程运行结束、放弃</span><span lang="EN-US">(yield)CPU</span><span>或由于某种原因进入阻塞状态，低优先级的线程才有机会执行。如果有两个优先级相同的线程都在等待</span><span lang="EN-US">CPU</span><span>，则调度程序以轮转的方式选择运行的线程。</p>
<h2><span lang="EN-US"><span><font face="Times New Roman">&nbsp;3. &nbsp;</font></span><span>线程状态的改变</span></h2>
<p><span>一个线程在其生命周期中可以从一种状态改变到另一种状态，线程状态的变迁如图</span><span>所示：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/santicom/360截图20110901225907310.jpg" /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span lang="EN-US"><font face="Times New Roman">1&gt;<span>&nbsp; </span></font></span><span>控制线程的启动和结束</span></p>
<p><span>当一个新建的线程调用它的</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法后即进入就绪状态，处于就绪状态的线程被线程调度程序选中就可以获得</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间，进入运行状态，该线程就开始运行</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法。</span></p>
<p><span>控制线程的结束稍微复杂一点。如果线程的</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法是一个确定次数的循环，则循环结束后，线程运行就结束了，线程对象即进入死亡状态。如果</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法是一个不确定循环，早期的方法是调用线程对象的</span><span lang="EN-US"><font face="Times New Roman">stop()</font></span><span>方法，然而由于该方法可能导致线程死锁，因此从</span><span lang="EN-US"><font face="Times New Roman">1.1</font></span><span>版开始，不推荐使用该方法结束线程。一般是通过设置一个标志变量，在程序中改变标志变量的值实现结束线程。请看下面的例子：</span></p>
<p><span>程序</span><span><font face="Times New Roman"> <span lang="EN-US">ThreadStop.java</span></font></span><span lang="EN-US"><font face="Times New Roman"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.</span><span style="color: #000000">*</span><span style="color: #000000">;<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Timer&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Runnable{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;flag</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(flag){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000">"</span><span style="color: #000000">\r\t</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">catch</span><span style="color: #000000">(InterruptedException&nbsp;e){}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">\n</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Thread.currentThread().getName()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;Stop</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;stopRun(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ThreadStop{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timer&nbsp;timer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Timer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;thread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(timer);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.setName(</span><span style="color: #000000">"</span><span style="color: #000000">Timer</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.start();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">100</span><span style="color: #000000">;i</span><span style="color: #000000">++</span><span style="color: #000000">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000">"</span><span style="color: #000000">\r</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">100</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">catch</span><span style="color: #000000">(InterruptedException&nbsp;e){}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.stopRun();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div></font></span>
<p><span>该程序在</span><span lang="EN-US"><font face="Times New Roman">Timer</font></span><span>类中定义了一个布尔变量</span><span lang="EN-US"><font face="Times New Roman">flag</font></span><span>，同时定义了一个</span><span lang="EN-US"><font face="Times New Roman">stopRun()</font></span><span>方法，在其中将该变量设置为</span><span lang="EN-US"><font face="Times New Roman">false</font></span><span>。在主程序中通过调用该方法，从而改变该变量的值，使得</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法的</span><span lang="EN-US"><font face="Times New Roman">while</font></span><span>循环条件不满足，从而实现结束线程的运行。</span></p>
<p><span>说明</span><font face="Times New Roman"><span lang="EN-US"><span>&nbsp; </span><span>在</span><span lang="EN-US">Thread</span><span>类中除了</span><span lang="EN-US">stop()</span><span>方法被标注为不推荐</span><span lang="EN-US">(deprecated) </span><span>使用外，</span><span lang="EN-US">suspend()</span><span>方法和</span><span lang="EN-US">resume()</span><span>方法也被标明不推荐使用，这两个方法原来用作线程的挂起和恢复.<br /><br /></span></font><span lang="EN-US"><font face="Times New Roman">2&gt;<span>&nbsp; </span></font></span><span>线程阻塞条件</span></p>
<p><span>处于运行状态的线程除了可以进入死亡状态外，还可能进入就绪状态和阻塞状态。下面分别讨论这两种情况：</span></p>
<p><span lang="EN-US"><font face="Times New Roman">(1) </font></span><span>运行状态到就绪状态</span></p>
<p><span>处于运行状态的线程如果调用了</span><span lang="EN-US"><font face="Times New Roman">yield()</font></span><span>方法，那么它将放弃</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间，使当前正在运行的线程进入就绪状态。这时有几种可能的情况：如果没有其他的线程处于就绪状态等待运行，该线程会立即继续运行；如果有等待的线程，此时线程回到就绪状态状态与其他线程竞争</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间，当有比该线程优先级高的线程时，高优先级的线程进入运行状态，当没有比该线程优先级高的线程时，但有同优先级的线程，则由线程调度程序来决定哪个线程进入运行状态，因此线程调用</span><span lang="EN-US"><font face="Times New Roman">yield()</font></span><span>方法只能将</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间让给具有同优先级的或高优先级的线程而不能让给低优先级的线程。</span></p>
<p><span>一般来说，在调用线程的</span><span lang="EN-US"><font face="Times New Roman">yield()</font></span><span>方法可以使耗时的线程暂停执行一段时间，使其他线程有执行的机会。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">(2) </font></span><span>运行状态到阻塞状态</span></p>
<p><span>有多种原因可使当前运行的线程进入阻塞状态，进入阻塞状态的线程当相应的事件结束或条件满足时进入就绪状态。使线程进入阻塞状态可能有多种原因：</span></p>
<p><span>&#9312; </span><span>线程调用了</span><span lang="EN-US"><font face="Times New Roman">sleep()</font></span><span>方法，线程进入睡眠状态，此时该线程停止执行一段时间。当时间到时该线程回到就绪状态，与其他线程竞争</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">Thread</font></span><span>类中定义了一个</span><span lang="EN-US"><font face="Times New Roman">interrupt()</font></span><span>方法。一个处于睡眠中的线程若调用了</span><span lang="EN-US"><font face="Times New Roman">interrupt()</font></span><span>方法，该线程立即结束睡眠进入就绪状态。</span></p>
<p><span>&#9313; </span><span>如果一个线程的运行需要进行</span><span lang="EN-US"><font face="Times New Roman">I/O</font></span><span>操作，比如从键盘接收数据，这时程序可能需要等待用户的输入，这时如果该线程一直占用</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>，其他线程就得不到运行。这种情况称为</span><span lang="EN-US"><font face="Times New Roman">I/O</font></span><span>阻塞。这时该线程就会离开运行状态而进入阻塞状态。</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>语言的所有</span><span lang="EN-US"><font face="Times New Roman">I/O</font></span><span>方法都具有这种行为。</span></p>
<p><span>&#9314; 有时要求当前线程的执行在另一个线程执行结束后再继续执行，这时可以调用</span><span lang="EN-US"><font face="Times New Roman">join()</font></span><span>方法实现，</span><span lang="EN-US"><font face="Times New Roman">join()</font></span><span>方法有下面三种格式：</span></p>
<p><span lang="EN-US"><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US"><font face="Times New Roman">public void join() throws InterruptedException </font></span><span>使当前线程暂停执行，等待调用该方法的线程结束后再执行当前线程。</span></p>
<p><span lang="EN-US"><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US"><font face="Times New Roman">public void join(long millis) throws InterruptedException </font></span><span>最多等待</span><span lang="EN-US"><font face="Times New Roman">millis</font></span><span>毫秒后，当前线程继续执行。</span></p>
<p><span lang="EN-US"><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US"><font face="Times New Roman">public void join(long millis, int nanos) throws InterruptedException </font></span><span>可以指定多少毫秒、多少纳秒后继续执行当前线程。</span></p>
<p><span>上述方法使当前线程暂停执行，进入阻塞状态，当调用线程结束或指定的时间过后，当前线程线程进入就绪状态，例如执行下面代码：</span></p>
<p><span lang="EN-US"><font face="Times New Roman">t.join();</font></span></p>
<p><span>将使当前线程进入阻塞状态，当线程</span><span lang="EN-US"><font face="Times New Roman">t</font></span><span>执行结束后，当前线程才能继续执行。</span></p>
<p><span>&#9315; 线程调用了</span><span lang="EN-US"><font face="Times New Roman">wait()</font></span><span>方法，等待某个条件变量，此时该线程进入阻塞状态。直到被通知</span><span lang="EN-US"><font face="Times New Roman">(</font></span><span>调用了</span><span lang="EN-US"><font face="Times New Roman">notify()</font></span><span>或</span><span lang="EN-US"><font face="Times New Roman">notifyAll()</font></span><span>方法</span><span lang="EN-US"><font face="Times New Roman">)</font></span><span>结束等待后，线程回到就绪状态。</span></p>
<p><span>&#9316; </span><span>另外如果线程不能获得对象锁，也进入就绪状态。</span></p>
<p><span>后两种情况在下一节讨论。</span></p>
<p></span><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></p></span></span></span></span></span></span></span></span></span></span></span><img src ="http://www.blogjava.net/santicom/aggbug/357765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2011-09-01 21:43 <a href="http://www.blogjava.net/santicom/archive/2011/09/01/357765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>复习下java多线程</title><link>http://www.blogjava.net/santicom/archive/2011/09/01/357763.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 01 Sep 2011 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/09/01/357763.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/357763.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/09/01/357763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/357763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/357763.html</trackback:ping><description><![CDATA[<div>好久没搞这个了，今天把以前的笔记整理下，当复习。 
<h3><span style="font-size: 12pt">Thread</span><span style="font-family: 黑体; font-size: 12pt">类和</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 黑体; font-size: 12pt">接口</span><span style="font-size: 12pt"></span></h3>
<p style="text-indent: 24pt"><span style="font-family: 宋体; font-size: 12pt">多线程是一个程序中可以有多段代码同时运行，那么这些代码写在哪里，如何创建线程对象呢</span><span style="font-size: 12pt">?</span></p>
<p><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;首先，我们来看</span><span style="font-size: 12pt">Java</span><span style="font-family: 宋体; font-size: 12pt">语言实现多线程编程的类和接口。在</span><span style="font-size: 12pt">java.lang</span><span style="font-family: 宋体; font-size: 12pt">包中定义了</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口和</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">类。</span></p>
<p>&nbsp;</p>
<p style="text-indent: 24pt"><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口中只定义了一个方法：</span></p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt"><span style="font-family: Symbol; font-size: 12pt">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt">public abstract void run() </span></p>
<p style="text-indent: 24pt"><span style="font-family: 宋体; font-size: 12pt">这个方法要由实现了</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口的类实现。</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">对象称为可运行对象，一个线程的运行就是执行该对象的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法。</span></p>
<p style="text-indent: 24pt"><span style="font-size: 12pt"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread</span><span style="font-family: 宋体; font-size: 12pt">类实现了</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口，因此</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">对象也是可运行对象。同时</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">类也是线程类<span style="font-family: 宋体; font-size: 12pt">，该类的常用构造方法如下：</p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt" class="MsoNormal"><span style="font-family: Symbol; font-size: 12pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public Thread() <o:p></o:p></font></span></p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt" class="MsoNormal"><span style="font-family: Symbol; font-size: 12pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public Thread(Runnable target)<o:p></o:p></font></span></p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt" class="MsoNormal"><span style="font-family: Symbol; font-size: 12pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public Thread(String name)<o:p></o:p></font></span></p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt" class="MsoNormal"><span style="font-family: Symbol; font-size: 12pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public Thread(Runnable target, String name)<br /><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">target</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">为线程运行的目标对象，即线程调用</span><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">start()</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">方法启动后运行那个对象的</span><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">run()</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">方法，该对象的类型为</span><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">Runnable</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">，若没有指定目标对象，则以当前类对象为目标对象，</span><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">name</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">为线程名</span><o:p></o:p></font></span></p>
<p style="text-indent: 24pt"><br /></span><span style="font-size: 12pt"></span></p>
<p style="text-indent: 24pt"></span><span style="font-size: 12pt"></span>&nbsp;</p>
<h2 style="margin: 18pt 0cm"><span style="font-size: 12pt" lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">线程的创建</span>&nbsp;</h2>
<p style="text-indent: 24pt"><span style="font-family: 宋体; font-size: 12pt">介绍下如何创建和运行线程的两种方法。线程运行的代码就是实现了</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口的类的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法或者是</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">类的子类的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法，因此构造线程体就有两种方法：<br /></span><span style="font-family: Symbol; font-size: 12pt"><span style="font: 7pt 'Times New Roman'"><span style="font-family: Symbol; font-size: 12pt">&nbsp;&nbsp;&nbsp; &#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>&nbsp;</span></span><span style="font-family: 宋体; font-size: 12pt">继承</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">类并覆盖它的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法；<br /><span style="font-family: Symbol; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-family: 宋体; font-size: 12pt">实现</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口并实现它的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法。</p>
<h3 style="margin: 6pt 0cm"><span style="font-size: 12pt" lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; 1，</font></span></span><span style="font-family: 黑体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">继承</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Thread</font></span><span style="font-family: 黑体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类创建线程</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></h3>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过继承</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Thread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，并覆盖</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，这时就可以用该类的实例作为线程的目标对象。下面的程序定义了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">SimpleThread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，它继承了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Thread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类并覆盖了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;background: silver; mso-char-indent-count: 2.0" class="MsoBodyText"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">SimpleThread.java<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public class SimpleThread extends Thread{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public SimpleThread(String str){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>super(str);<o:p></o:p></font></span></p>
<p style="text-indent: 12pt; margin: 0cm 0cm 0pt 31.5pt; mso-char-indent-count: 1.0; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="text-indent: 12pt; margin: 0cm 0cm 0pt 31.5pt; mso-char-indent-count: 1.0; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public void run(){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>for(int i=0; i&lt;100; i++){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>System.out.println(getName()+" = "+ i);<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>try{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;</span>sleep((int)(Math.random()*100));<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>}catch(InterruptedException e){}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>} <o:p></o:p></font></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt 31.5pt; mso-char-indent-count: 2.0; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">System.out.println(getName()+ " DONE");<o:p></o:p></font></span></p>
<p style="text-indent: 12pt; margin: 0cm 0cm 0pt 31.5pt; mso-char-indent-count: 1.0; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd" class="1"><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">_____________________________________________________________________________</font></span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt">&#9603;</span><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="margin: 0cm 0cm 0pt" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>SimpleThread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类继承了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Thread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，并覆盖了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，该方法就是线程体。</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;background: silver; mso-char-indent-count: 2.0" class="MsoBodyText"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"> ThreadTest.java<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public class ThreadTest{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public static void main(String args[]){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Thread t1 = new SimpleThread("Runner A");<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Thread t2 = new SimpleThread("Runner B");<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>t1.start();<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>t2.start();<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd" class="1"><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">_____________________________________________________________________________</font></span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt">&#9603;</span><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">ThreadTest</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">main()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法中创建了两个</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">SimpleThread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的线程对象并调用线程类的</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">start()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法启动线程。构造线程时没有指定目标对象，所以线程启动后执行本类的</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意，实际上</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">ThreadTest</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序中有三个线程同时运行</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在应用程序的</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">main()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法启动时，</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就创建一个主线程，在主线程中可以创建其他线程。<br /><br /></p>
<h3 style="margin: 6pt 0cm"><span style="font-size: 12pt" lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; 2，</font></span></span><span style="font-family: 黑体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Runnable</font></span><span style="font-family: 黑体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口创建线程</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></h3>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以定义一个类实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Runnable</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口，然后将该类对象作为线程的目标对象。实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Runnable</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口就是实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt">下面程序通过实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Runnable</font></span><span style="font-family: 宋体; font-size: 12pt">接口构造线程体。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;background: silver; mso-char-indent-count: 2.0" class="MsoBodyText"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序</span><span style="font-size: 12pt"><font face="Times New Roman"> <span lang="EN-US">ThreadTest.java<o:p></o:p></span></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">class T1 implements Runnable{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public void run(){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=0;i&lt;15;i++)<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("Runner A="+i);<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">class T2 implements Runnable{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public void run(){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int j=0;j&lt;15;j++)<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("Runner B="+j);<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public class ThreadTest{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public static void main(String args[]){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Thread t1=new Thread(new T1(),"Thread A");<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Thread t2=new Thread(new T2(),"Thread B");<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>t1.start();<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>t2.start();<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd" class="1"><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">_____________________________________________________________________________</font></span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt">&#9603;</span><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><br /><br /></span></p>
<p>&nbsp;</p><br /><br /></div><img src ="http://www.blogjava.net/santicom/aggbug/357763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2011-09-01 20:46 <a href="http://www.blogjava.net/santicom/archive/2011/09/01/357763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>