﻿<?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-jinfeng_wang</title><link>http://www.blogjava.net/jinfeng_wang/</link><description>G-G-S,D-D-U!</description><language>zh-cn</language><lastBuildDate>Thu, 16 Oct 2008 01:51:55 GMT</lastBuildDate><pubDate>Thu, 16 Oct 2008 01:51:55 GMT</pubDate><ttl>60</ttl><item><title>破解Word文件密码保护的简单方法 </title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/08/06/220426.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Wed, 06 Aug 2008 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/08/06/220426.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/220426.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/08/06/220426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/220426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/220426.html</trackback:ping><description><![CDATA[今天在网上找了些文档，发现被设置了文档保护，只能读，不能修改。<br />
<br />
找到了下面的内容：<br />
<br />
http://www.cnblogs.com/shixianyong/archive/2006/07/26/459908.html<br />
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Verdana"><span style="font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;在使用</span>Word<span style="font-family: SimSun">进行档保护时，我们经常会使用到窗体保护（工具</span>-&gt;<span style="font-family: SimSun">保护文文件），用窗体保护最为彻底，用户无法编辑，也无法进行</span>Copy&amp;Paste<span style="font-family: SimSun">操作，前几天发布的</span>Word<span style="font-family: SimSun">文档的漏洞可以让你用很简单的方法去掉这个密码。</span></font></font><br />
<font size="2"><font face="Verdana"><strong><span style="background: aqua; font-family: SimSun"><br />
我们自己来测试一下：</span></strong> <br />
</font></font><br />
<font size="2"><font face="Verdana"><span style="font-family: SimSun">首先创建一个</span>Word<span style="font-family: SimSun">文文件，使用窗体保护的方式保护文档，工具</span>-&gt;<span style="font-family: SimSun">保护文档</span>-&gt;Check&#8220;<span style="font-family: SimSun">仅允许在文档中进行此类编辑</span>&#8221;-&gt;Choose&#8220;<span style="font-family: SimSun">填写窗体</span>&#8221;<span style="font-family: SimSun">，此时会弹出一个密码框，输入</span>2<span style="font-family: SimSun">次密码（我这里选择</span>123<span style="font-family: SimSun">作为</span>word<span style="font-family: SimSun">文件密码），这样，该文档就已经被保护起来了。<br />
</span>&nbsp;</font></font><br />
</p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Verdana"><span style="font-family: SimSun">&nbsp;&nbsp;&nbsp; 然后我们来破解它，打开刚才创建的</span>Word<span style="font-family: SimSun">文檔，檔</span>-&gt;<span style="font-family: SimSun">另存为</span>-&gt;<span style="font-family: SimSun">选择</span>HTML<span style="font-family: SimSun">格式，存为一个</span>HTML<span style="font-family: SimSun">文档，用记事本打开该</span>HTML<span style="font-family: SimSun">文件，搜索</span>"&lt;w:UnprotectPassword&gt;"<span style="font-family: SimSun">，你会看到</span>5BCECF7A<span style="font-family: SimSun">的字样（如果你的密码是用的</span>123<span style="font-family: SimSun">的话）。接着我们用</span>UltraEdit<span style="font-family: SimSun">或其它类似的工具打开最初受保护的</span>Word<span style="font-family: SimSun">文檔，搜索</span>7ACFCE5B<span style="font-family: SimSun">，搜索到后，都用</span>8<span style="font-family: SimSun">个</span>0<span style="font-family: SimSun">来代替，存档。</span></font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Verdana"><span style="font-family: SimSun">&nbsp;&nbsp;&nbsp; 此时的</span>Word<span style="font-family: SimSun">文文件的密码就被清空了，你就可以自己取消文文件保护了，密码就不用输入了，按个回车了事。</span>MS<span style="font-family: SimSun">还没有对这个漏洞提供补丁，我觉得短期可能还无法解决这个问题，建议以后的文档不要用这个东西进行保护了。</span></font></font></p>
<br />
<br />
<br />
==》<br />
<p>更好的做法：</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 然后我们来破解它，打开刚才创建的Word文檔，檔-&gt;另存为-&gt;选择HTML格式，存为一个HTML文档，用记事本打开该HTML文件，搜索"&lt;w:UnprotectPassword&gt;"， 找到相关内容， 例如：&lt;w:UnprotectPassword&gt;7E18B4B2&lt;/w:UnprotectPassword&gt;</p>
<p><br />
直接把&#8220;&lt;w:UnprotectPassword&gt;7E18B4B2&lt;/w:UnprotectPassword&gt;&#8221;<br />
替换为"&lt;w:UnprotectPassword&gt;5BCECF7A&lt;/w:UnprotectPassword&gt;"<br />
后保存HTML文件。</p>
<p><br />
再用Word打开Word文件，再选择解除文档保护， 输入密码123</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/220426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-08-06 14:01 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/08/06/220426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Print Text</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/08/05/220241.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 05 Aug 2008 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/08/05/220241.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/220241.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/08/05/220241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/220241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/220241.html</trackback:ping><description><![CDATA[import java.awt.*;<br />
import java.awt.print.*;<br />
import java.io.*;<br />
<br />
/**<br />
* Utility class to print some lines of text to the default printer. Uses some<br />
* default font settings, and gets the page size from the PrinterJob object.<br />
* <br />
* Note: this little example class does not handle pagination. All the text must<br />
* fit on a single page.<br />
* <br />
* This class can also be used as a standalone utility. If the main method is<br />
* invoked, it reads lines of text from System.in, and prints them to the<br />
* default printer.<br />
*/<br />
<br />
public class PrintGIF implements Printable {<br />
/**<br />
* Default font size, 12 point<br />
*/<br />
public static final int DEFAULT_FONT_SIZE = 12;<br />
<br />
/**<br />
* Default type name, Serif<br />
*/<br />
public static final String DEFAULT_FONT_NAME = "Serif";<br />
<br />
private PrinterJob job;<br />
<br />
private String typeName;<br />
<br />
private int typeSize;<br />
<br />
private Font typeFont;<br />
<br />
private Font typeFontBold;<br />
<br />
private String[] header;<br />
<br />
private String[] body;<br />
<br />
/**<br />
* Create a TextPrinter object with the default type font and size.<br />
*/<br />
public PrintGIF() {<br />
this(DEFAULT_FONT_NAME, DEFAULT_FONT_SIZE);<br />
}<br />
<br />
/**<br />
* Create a TextPrinter object ready to print text with a given font and<br />
* type size.<br />
*/<br />
public PrintGIF(String name, int size) {<br />
if (size &lt; 3 || size &gt; 127) {<br />
throw new IllegalArgumentException("Type size out of range");<br />
}<br />
typeName = name;<br />
typeSize = size;<br />
typeFont = new Font(typeName, Font.PLAIN, typeSize);<br />
typeFontBold = new Font(typeName, Font.BOLD, typeSize);<br />
job = null;<br />
}<br />
<br />
/**<br />
* Initialize the printer job.<br />
*/<br />
protected void init() {<br />
job = PrinterJob.getPrinterJob();<br />
}<br />
<br />
/**<br />
* Initialize the print job, and return the base number of characters per<br />
* line with the established font size and font. This is really just a<br />
* guess, because we can't get the font metrics yet.<br />
*/<br />
public int getCharsPerLine() {<br />
if (job == null) {<br />
init();<br />
}<br />
PageFormat pf;<br />
pf = job.defaultPage();<br />
double width = pf.getImageableWidth(); // in 72nd of a pt<br />
double ptsize = typeFont.getSize();<br />
double ptwid = ptsize * 3 / 4;<br />
double cnt = (width / ptwid);<br />
return (int) (Math.round(cnt));<br />
}<br />
<br />
/**<br />
* Print some text. Headers are printed first, in bold, followed by the body<br />
* text, in plain style. If the boolean argument interactive is set to true,<br />
* then the printer dialog gets shown.<br />
* <br />
* Either array may be null, in which case they are treated as empty.<br />
* <br />
* This method returns true if printing was initiated, or false if the user<br />
* cancelled printer. This method may throw PrinterException if printing<br />
* could not be started.<br />
*/<br />
public boolean doPrint(String[] header, String[] body, boolean interactive)<br />
throws PrinterException {<br />
if (job == null) {<br />
init();<br />
}<br />
if (interactive)<br />
try {<br />
if (job.printDialog()) {<br />
// we are going to print<br />
} else {<br />
// we are not going to print<br />
return false;<br />
}<br />
} catch (Exception pe) {<br />
System.err.println("Could not pop up print dialog");<br />
// assume user wants to print anyway...<br />
}<br />
<br />
job.setPrintable(this);<br />
this.header = header;<br />
this.body = body;<br />
job.print();<br />
job = null; // we are no longer initialized<br />
return true;<br />
}<br />
<br />
/**<br />
* Perform printing according to the Java printing model. NEVER CALL THIS<br />
* DIRECTLY! It will be called by the PrinterJob as necessary. This method<br />
* always returns Printable.NO_SUCH_PAGE for any page number greater than 0.<br />
*/<br />
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)<br />
throws PrinterException {<br />
if (pageIndex != 0) {<br />
return NO_SUCH_PAGE;<br />
}<br />
FontMetrics fm;<br />
graphics.setFont(typeFont);<br />
graphics.setColor(Color.black);<br />
fm = graphics.getFontMetrics();<br />
<br />
// fill in geometric and rendering guts here<br />
int i;<br />
double x, y;<br />
x = pageFormat.getImageableX();<br />
y = pageFormat.getImageableY() + fm.getMaxAscent();<br />
<br />
// do the headings<br />
if (header != null) {<br />
graphics.setFont(typeFontBold);<br />
for (i = 0; i &lt; header.length; i++) {<br />
graphics.drawString(header[i], (int) x, (int) y);<br />
y += fm.getHeight();<br />
}<br />
}<br />
<br />
// do the body<br />
if (body != null) {<br />
graphics.setFont(typeFont);<br />
for (i = 0; i &lt; body.length; i++) {<br />
graphics.drawString(body[i], (int) x, (int) y);<br />
y += fm.getHeight();<br />
}<br />
}<br />
<br />
return PAGE_EXISTS;<br />
}<br />
<br />
/**<br />
* Main method for testing. This main method sets up a header of<br />
* "PRINTER TEST" and reads System.in to get body text.<br />
*/<br />
public static void main(String[] args) {<br />
BufferedReader br;<br />
java.util.List lines;<br />
<br />
TextPrinter tp;<br />
tp = new TextPrinter();<br />
lines = new java.util.ArrayList();<br />
try {<br />
InputStreamReader isr;<br />
isr = new InputStreamReader(System.in);<br />
br = new BufferedReader(isr);<br />
String line;<br />
for (line = br.readLine(); line != null; line = br.readLine()) {<br />
lines.add(line);<br />
}<br />
br.close();<br />
<br />
System.out.println("chars per line: " + tp.getCharsPerLine());<br />
System.out.println("attempting to print...");<br />
String[] headers = new String[1];<br />
headers[0] = "PRINT TEST";<br />
String[] body = new String[lines.size()];<br />
for (int ix = 0; ix &lt; lines.size(); ix++) {<br />
body[ix] = (String) (lines.get(ix));<br />
}<br />
boolean didit = tp.doPrint(headers, body, true);<br />
System.out.println("doPrint returns " + didit);<br />
} catch (Exception e) {<br />
System.err.println("Error printing: " + e);<br />
e.printStackTrace();<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/220241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-08-05 17:13 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/08/05/220241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 Eclipse 中使用 5 个有用的插件来自动化代码质量分析zz </title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/07/01/211858.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 01 Jul 2008 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/07/01/211858.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/211858.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/07/01/211858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/211858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/211858.html</trackback:ping><description><![CDATA[<div class="postbody clearfix">
<p><strong>在 Eclipse 中使用 5 个有用的插件来自动化代码质量分析</strong><strong></strong></p>
<p><strong></strong></p>
<p>&nbsp;</p>
<p>如果能在构建代码前发现代码中潜在的问题会怎么样呢？很有趣的是，Eclipse 插件中就有这样的工具，比如 JDepend 和 CheckStyle，它们能帮您在软件问题暴露前发现这些问题。</p>
<p>&nbsp;</p>
<p>开发软件时，我的主要目标之一是：要么防止将缺陷引入代码库，要么限制缺陷的生存期；换言之，要尽早找到缺陷。很显然，越是了解如何编写更好的代码以及如何有效测试软件，就越能及早地捕捉到缺陷。我也很想要一张能发现潜在缺陷的安全之网。</p>
<p>&nbsp;</p>
<p>将检验工具集成到构建过程（例如，使用 Ant 或 Maven）中，能够建立起一种寻找潜在缺陷的方法。尽管这种方法使一致性成为可能并超越了 IDE，但它也有一点反作用。必须在本地构建软件或等待 Continuous Integration 构建的运行。如果使用 Eclipse 插件，就可以在通过 Continuous Integration 构建或集成前发现一些这样的冲突。这就促成了我称为的渐进编程编程方式，在这种方式下，允许在编码过程中进行一定程度的质量检验 —— 再也不能比这个更早了！</p>
<p>&nbsp;</p>
<p>本文涵盖了我所认为的 &#8220;五大&#8221; 代码分析领域：</p>
<ul>
    <li>编码标准
    <li>代码重复
    <li>代码覆盖率
    <li>依赖项分析
    <li>复杂度监控 </li>
</ul>
<p>&nbsp;</p>
<p>可以用接下来的几个灵活的 Eclipse 插件来揭示这些分析领域：</p>
<ul>
    <li>CheckStyle：用于编码标准
    <li>PMD 的 CPD：帮助发现代码重复
    <li>Coverlipse：测量代码覆盖率
    <li>JDepend：提供依赖项分析
    <li>Eclipse Metric 插件：有效地查出复杂度 </li>
</ul>
<p>&nbsp;</p>
<p><strong><span style="font-size: large">安装 Eclipse 插件</span></strong></p>
<p><strong></strong></p>
<p>&nbsp;</p>
<p>安装 Eclipse 插件再简单不过了，只需要几个步骤。在开始之前，最好把该插件下载站点的 URL 准备好。表 1 是本文用到的插件的列表：</p>
<p>&nbsp;</p>
<p><strong>表 1. 代码改进插件和相应的下载站点 URL</strong><br />
<table style="width: 731px; height: 124px" border="0">
    <tbody>
        <tr>
            <td><strong>工具</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>目的</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Eclipse 插件的 URL</strong> </td>
        </tr>
        <tr>
            <td>CheckStyle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编码标准分析&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://eclipse-cs.sourceforge.net/update/">http://eclipse-cs.sourceforge.net/update/</a> </td>
        </tr>
        <tr>
            <td>Coverlipse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测试代码覆盖率&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://coverlipse.sf.net/update">http://coverlipse.sf.net/update</a> </td>
        </tr>
        <tr>
            <td>CPD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 复制/粘贴检验&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://pmd.sourceforge.net/eclipse/">http://pmd.sourceforge.net/eclipse/</a> </td>
        </tr>
        <tr>
            <td>JDepend&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包依赖项分析&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://andrei.gmxhome.de/eclipse/">http://andrei.gmxhome.de/eclipse/</a> </td>
        </tr>
        <tr>
            <td>Metrics&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 复杂度监控&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://metrics.sourceforge.net/update">http://metrics.sourceforge.net/update</a> </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>知道了这些有用插件的下载地址后，安装插件就是一个极简单的过程。启动 Eclipse，然后遵循下列步骤：</p>
<p>&nbsp;</p>
<p>1、选择 <strong>Help | Software Updates | Find and Install</strong>，如图 1 所示：</p>
<p>&nbsp;</p>
<p><strong>图 1. 寻找并安装 Eclipse 插件</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/findinstall-plugin.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>2、选择 <strong>Search for new features to install</strong> 单选按钮,单击 <strong>Next</strong>。</p>
<p>&nbsp;</p>
<p>3、单击 <strong>New Remote Site</strong>，输入要安装的插件名和 URL（参见图 2），单击 <strong>OK</strong>，然后单击 <strong>Finish</strong> 来显示 Eclipse 更新管理器。</p>
<p>&nbsp;</p>
<p><strong>图 2. 配置新的远程站点</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/pmd-remotesite.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>4、在 Eclipse 更新管理器中，有一个查看插件各方面特性的选项。我通常选择顶级项，如图 3 所示。选择您需要的选项并单击 <strong>Finish</strong>。Eclipse 现在安装该插件。您需要重启 Eclipse 实例。</p>
<p>&nbsp;</p>
<p><strong>图 3. 安装 Eclipse 插件</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="安装 Eclipse 插件" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/pmd-updates.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>请遵循上述这些步骤来安装其他的 Eclipse 插件；只需改变插件名和相应的下载位置即可。</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: large">用 CheckStyle 校正标准</span></strong></p>
<p><strong></strong></p>
<p>&nbsp;</p>
<p>代码库的可维护性直接影响着软件的整个成本。另外，不佳的可维护性还会让开发人员十分头痛（进而导致开发人员的缺乏）—— 代码越容易修改，就越容易添加新的产品特性。像 CheckStyle 这样的工具可以协助寻找那些可影响到可维护性、与编码标准相冲突的地方，比方说，过大的类、太长的方法和未使用的变量等等。</p>
<p>&nbsp;</p>
<p>使用 Eclipse 的 CheckStyle 插件的好处是能够在编码过程中了解到源代码上下文的各种编码冲突，让开发人员更可能在签入该代码前真正处理好这些冲突。您也几乎可以把 CheckStyle 插件视作一个连续的代码复查工具！ </p>
<p>&nbsp;</p>
<p>安装 CheckStyle 插件并做如下配置（参见图 4）：</p>
<p>&nbsp;</p>
<p>1、选择 <strong>Project</strong>，然后选择 Eclipse 菜单中的 <strong>Properties</strong> 菜单项。</p>
<p>&nbsp;</p>
<p>2、选择 <strong>CheckStyle active for this project</strong> 复选框，单击 <strong>OK</strong>。</p>
<p>&nbsp;</p>
<p><strong>图 4. 在 Eclipse 中配置 CheckStyle 插件</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/checkstyle-config.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>Eclipse 重新构建工作空间，并在 Eclipse 控制台中列示已发现的编码冲突，如图 5 所示：</p>
<p>&nbsp;</p>
<p><strong>图 5. Eclipse 中 CheckStyle 的代码冲突列表</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/checkstyle-eclipse.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>使用 CheckStyle 插件在 Eclipse 内嵌入编码标准检验是一种很棒的方法，用这种方法可以在编码时 积极地改进代码，从而在开发周期的早期发现源代码中潜在的缺陷。这么做还有更多的好处，如节省时间、减少失败，也因此会减少项目的成本。没错，这就是一种积极主动的方式！</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: large">用 Coverlipse 确认覆盖率</span></strong></p>
<p><strong></strong></p>
<p>&nbsp;</p>
<p>Coverlipse 是一个用于 Cobertura 的 Eclipse 插件，Cobertura 是一个代码覆盖率工具，可以用它来评估具有相应测试的源代码的比率。Cobertura 也提供一个 Ant 任务和 Maven 插件，但用 Cobertura，您可以在编写代码时 评估代码覆盖率。您见过这样的模式吗？</p>
<p>&nbsp;</p>
<p>通过选择 Eclipse 菜单项 <strong>Run</strong> 安装 Coverlipse 插件并将其和 JUnit 关联起来，该操作会显示一系列运行配置选项，例如 JUnit、SWT 应用程序和 Java&#8482; 应用程序。右键单击它并选择 <strong>JUnit w/Coverlipse</strong> 节点中的 <strong>New</strong>。在这里，需要确定 JUnit 测试的位置，如图 6 所示：</p>
<p>&nbsp;</p>
<p><strong>图 6. 配置 Coverlipse 以获取代码覆盖率</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/coverlipse-config.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>一旦单击了 Run，Eclipse 会运行 Coverlipse 并在源代码（如图 7 所示）中嵌入标记，该标记显示了具有相关 JUnit 测试的代码部分：</p>
<p>&nbsp;</p>
<p><strong>图 7. Coverlipse 生成的具有嵌入类标记的报告</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/coverlipse-report.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>正如您所见，使用 Coverlipse Eclipse 插件可以更快地确定代码覆盖率。例如，这种实时数据功能有助于在将代码签入 CM 系统前 更好地进行测试。这对渐进编程来说意味着什么呢？</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: large">用 CPD 捕捉代码重复</span></strong></p>
<p><strong></strong></p>
<p>&nbsp;</p>
<p>Eclipse 的 PMD 插件提供了一项叫做 CPD（或复制粘贴探测器）的功能，用于寻找重复的代码。为在 Eclipse 中使用这项便利的工具，需要安装具有 PMD 的 Eclipse 插件，该插件具有 CPD 功能。</p>
<p>&nbsp;</p>
<p>为寻找重复的代码，请用右键单击一个 Eclipse 项目并选择 <strong>PMD | Find Suspect Cut and Paste</strong>，如图 8 所示：</p>
<p>&nbsp;</p>
<p><strong>图 8. 使用 CPD 插件运行复制粘贴检验</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/cpd-eclipse.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>一旦运行了 CPD，您的 Eclipse 根目录下就会创建出一个 report 文件夹，其中包含一个叫做 cpd.txt 的文件，文件中列示了所有重复的代码。图 9 中是一个 cpd.txt 文件的例子：</p>
<p>&nbsp;</p>
<p><strong>图 9. Eclipse 插件生成的 CPD 文本文件</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/cpd-report.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>靠人工来寻找重复的代码是一项挑战，但使用像 CPD 这样的插件却能在编码时轻松地发现重复的代码。</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: large">使用 JDepend 进行依赖项检查</span></strong></p>
<p><strong></strong></p>
<p>&nbsp;</p>
<p>JDepend 是个可免费获取的开源工具，它为包依赖项提供面向对象的度量值，以此指明代码库的弹性。换句话说，JDepend 可有效测量一个架构的健壮性（反之，脆弱性）。</p>
<p>&nbsp;</p>
<p>除了 Eclipse 插件，JDepend 还提供一个 Ant 任务、Maven 插件和一个 Java 应用程序，用以获取这些度量值。对于相同的信息，它们有着不同的传递机制；但 Eclipse 插件的特别之处和相应优点是：它能以更接近源代码（即，编码时）的方式传递这条信息。</p>
<p>&nbsp;</p>
<p>图 10 演示了使用 Eclipse JDepend 插件的方法：通过右键单击源文件夹并选择 <strong>Run JDepend Analysis</strong>。一定要选择一个含源代码的源文件夹；否则看不到此菜单项。</p>
<p>&nbsp;</p>
<p><strong>图 10. 使用 JDepend Analysis 分析代码</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/run-jdepend.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>图 11 显示了运行 JDepend Analysis 时生成的报告。左边显示包，右边显示针对每个包的依赖项度量值。</p>
<p>&nbsp;</p>
<p><strong>图 11. Eclipse 项目中的包依赖项</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/jdepend-report.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>正如您所见，JDepend 插件提供了有助于不断观察架构可维护性变化的大量信息 —— 这其中最大的好处是您可以在编码时看到这些数据。</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: large">用 Metrics 测量复杂度</span></strong></p>
<p><strong></strong></p>
<p>&nbsp;</p>
<p>&#8220;五大&#8221;代码分析最后的一项是测量复杂度。Eclipse 提供一种叫做 Metrics 的插件，使用该插件可以进行许多有用的代码度量，包括圈复杂度度量，它用于测量方法中惟一路径的数目。</p>
<p>&nbsp;</p>
<p>1、右键单击您的项目并选择 <strong>Properties</strong> 菜单。在结果窗口中，选择 <strong>Enable Metrics plugin</strong> 复选框并单击 <strong>OK</strong>，如图 12 所示：</p>
<p>&nbsp;</p>
<p><strong>图 12. 为项目配置 Metrics</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/metrics-enable-project-properties.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>2、从 Eclipse 中选择 <strong>Window</strong> 菜单打开 Metrics 视图，然后选择 <strong>Show View | Other...</strong>。</p>
<p>&nbsp;</p>
<p>3、选择 <strong>Metrics | Metrics View</strong> 打开如图 13 中显示的窗口。您需要使用 Java 透视图并重新构建项目，从而显示这些度量值。</p>
<p>&nbsp;</p>
<p><strong>图 13. 打开 Eclipse 中的 Metrics View</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/metrics-view.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>&nbsp;4、单击 <strong>OK</strong> 来显示如图 14 中的窗口。</p>
<p>&nbsp;</p>
<p>在此例中，我正在查看一个单独方法的圈复杂度。真正妙的是您可以双击 Metrics 列表中的方法，该插件会在 Eclipse 编辑器中为此方法打开源代码。这就让修正变得超级简单（如果需要的话）！</p>
<p>&nbsp;</p>
<p><strong>图 14. 查看方法的圈复杂度</strong></p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://www.ibm.com/developerworks/cn/java/j-ap01117/metrics-report.jpg" _counted="undefined" /></p>
<p>&nbsp;</p>
<p>正如我之前提到过的，Eclipse Metrics 插件还提供了许多功能强大的度量值，有助于您在开发软件的过程中改进代码 —— 可见，它是一个渐进编程意义上的插件!</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: large">合适的才是最好的</span></strong></p>
<p>&nbsp;</p>
<p>正如您从本文中看到的那样，将&#8220;五大&#8221;测量方法，即编码标准、代码重复、代码覆盖率、依赖项分析和复杂度监控，用于改进代码质量十分重要。但适合您的才是好的。请记住还有其他许多可用的 Eclipse 插件（比如 PMD 和 FindBugs）能够帮助您在开发周期的早期改进代码质量。不管您想要的工具或偏爱的方法是什么，重要的是：行动起来去积极改进代码质量并让手工代码检验的过程变得更加有效。我估计您使用这些插件一段时间后，就再也离不开它们了。</p>
</div>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/211858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-07-01 12:04 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/07/01/211858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>02-06一级语法真题精解 zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/06/03/205563.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 03 Jun 2008 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/06/03/205563.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/205563.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/06/03/205563.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/205563.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/205563.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;一级语法真题精解(2002年)【1】出席欠席の____、同封した葉書にてお返事くださるようお願いいたします。　　1そばから　　2ないまでも　　3次第にしては　　4いかんによらず【2】私は、彼の失礼____態度に我慢ならなかった。　　1きわまった　　2きわまりない　　3きわめた　　4きわめない【3】田中さんは、この1週間と____、仕事どころではないようだ。　　1...&nbsp;&nbsp;<a href='http://www.blogjava.net/jinfeng_wang/archive/2008/06/03/205563.html'>阅读全文</a><img src ="http://www.blogjava.net/jinfeng_wang/aggbug/205563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-06-03 14:59 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/06/03/205563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>能力考试各大考场大盘点（送给即将报名的同学）  zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/06/02/205316.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Mon, 02 Jun 2008 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/06/02/205316.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/205316.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/06/02/205316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/205316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/205316.html</trackback:ping><description><![CDATA[http://www.coffeejp.com/bbs/viewthread.php?tid=199523&amp;extra=page%3D1&amp;page=1&nbsp; <br />
<p><strong><br />
<br />
1020201&nbsp;</strong><strong><span style="font-family: SimSun">上海外国语大学海外考试中心</span></strong></p>
<p><strong><span style="font-family: SimSun">上海市东体育会路</span>410</strong><strong><span style="font-family: SimSun">号</span>&nbsp;021 65311900-2584 65422002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200083&nbsp;</strong></p>
<p><span style="font-family: SimSun">【考试级别】</span>1<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】单人单耳机</span></p>
<p><span style="font-family: SimSun">【考场环境】</span>150<span style="font-family: SimSun">人</span>+10<span style="font-family: SimSun">个左右监考</span> <span style="font-family: SimSun">门口还有护驾的</span>401<span style="font-family: SimSun">那个</span>1<span style="font-family: SimSun">号坑</span></p>
<p><span style="font-family: SimSun">【监考态度】满意</span> <span style="font-family: SimSun">姐姐们长得都很</span>PP=w=</p>
<p><span style="font-family: SimSun">【总评】考场人多</span> <span style="font-family: SimSun">外面堵车严重</span> <span style="font-family: SimSun">收废品的多</span> <span style="font-family: SimSun">听力设备没话说</span>&nbsp;401<span style="font-family: SimSun">大礼堂</span> <span style="font-family: SimSun">和</span>1<span style="font-family: SimSun">楼那</span>2<span style="font-family: SimSun">个听力教室不一样平时不对外开放设备相对完好</span> 1<span style="font-family: SimSun">楼那第一个听力教室平时就有耳机</span>zi zi<span style="font-family: SimSun">的</span></p>
<p><span style="font-family: SimSun">【考点】培训部</span>118<span style="font-family: SimSun">室</span></p>
<p><span style="font-family: SimSun">【听力设备】单人单用头戴式收音机。效果非常清楚</span></p>
<p><span style="font-family: SimSun">【考场环境】考场</span>80<span style="font-family: SimSun">人</span> <span style="font-family: SimSun">距离很接近</span> <span style="font-family: SimSun">但是周围有居民楼，稍有干扰。</span></p>
<p><span style="font-family: SimSun">【监考态度】</span>4<span style="font-family: SimSun">个监考老师，非常仔细和严格。</span></p>
<p><span style="font-family: SimSun">【总评】整体感觉很好</span></p>
<p><span style="font-family: SimSun">【听力设备】校方提供耳机，声音很清楚。（</span>3<span style="font-family: SimSun">、</span>4<span style="font-family: SimSun">级好像需要自备耳机）</span></p>
<p><span style="font-family: SimSun">【考场环境】中等规模教室，大约容纳</span>50<span style="font-family: SimSun">人，一人一个小座位。看到对面一个教室是只能容纳</span>10<span style="font-family: SimSun">人左右的小教室</span></p>
<p><span style="font-family: SimSun">【监考态度】</span>3<span style="font-family: SimSun">个老师很认真负责又人性化又客气，很满意</span></p>
<p><span style="font-family: SimSun">【总评】上外口碑一向很好。这次唯一的遗憾就是听力不能调音量（起码我没找到）感觉好像声音大了点反而影响了自己听力发挥，但据其他楼考试同学反映他们那里都能调节音量。其他都非常满意，词汇还提早了几分钟发卷。还有就是座位很近，作弊特简单</span>.....</p>
<p><span style="font-family: SimSun">推荐上海的考生首选上外</span></p>
<p><span style="font-family: SimSun">【听力设备】一人一个耳机，然后在教室里放录音，虽然看起来很破，但效果还真不错</span></p>
<p><span style="font-family: SimSun">【考场环境】</span>30<span style="font-family: SimSun">个人一间小教室，对面就是厕所，非常方便</span></p>
<p><span style="font-family: SimSun">【监考态度】有个考生开手机看时间，副监考居然允许了&#8230;&#8230;之后来了短信，主监考才惊觉，要求关掉之后，也没咋样。唯一有点郁闷的是，考阅读语法时几个老师开始在门口聊天，虽然没多大影响，但感觉总不太好。</span></p>
<p><span style="font-family: SimSun">【总评】上外还是很不错的，就是去的时候门口实在太堵。</span></p>
<p><span style="font-family: SimSun">【听力设备】自带收音机，效果一般，有</span>ZIZI<span style="font-family: SimSun">的声音，还有回音</span></p>
<p><span style="font-family: SimSun">【考场环境】</span>66<span style="font-family: SimSun">人左右</span></p>
<p><span style="font-family: SimSun">【监考态度】还蛮好的，监考老师</span>1<span style="font-family: SimSun">男</span>2<span style="font-family: SimSun">女，有几个同学带的</span>mp3<span style="font-family: SimSun">不可以用，老师给他们几个弄来了个收音机，敞开放着听。</span></p>
<p><span style="font-family: SimSun">总的来说</span> <span style="font-family: SimSun">：比上不足，比下还算是好的了</span>... </p>
<p><span style="font-family: SimSun">【考试级别】</span> 2<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【考点】贤达学院</span></p>
<p><span style="font-family: SimSun">【听力设备】</span> <span style="font-family: SimSun">自带收音机，效果蛮好。上外的听力总体反映都不错！</span></p>
<p><span style="font-family: SimSun">【考场环境】</span> <span style="font-family: SimSun">小教室，座位之间的间隔都比较小，好像挺有利于扫到其他人的卷子的。不过本人安心做自己卷子。</span>50<span style="font-family: SimSun">人左右，有</span>4<span style="font-family: SimSun">、</span>5<span style="font-family: SimSun">缺考。。</span></p>
<p><span style="font-family: SimSun">【监考态度】</span> <span style="font-family: SimSun">三个老师，二男一女，比较人性化，态度蛮好。主监考的比较幽默。</span></p>
<p><span style="font-family: SimSun">【总评】</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: SimSun">总感觉不错，适合考试的地方。</span></p>
<p><span style="font-family: SimSun">【听力设备】校方提供耳机，声音满清楚</span>,<span style="font-family: SimSun">只是那个机器体积大了点</span>,<span style="font-family: SimSun">影响了放考卷的空间</span>.</p>
<p><span style="font-family: SimSun">【考场环境】中等规模教室，大约容纳</span>50<span style="font-family: SimSun">人，一人一个独立座位。有空调不过没开</span>.<span style="font-family: SimSun">里面不冷</span>.</p>
<p><span style="font-family: SimSun">【监考态度】</span>3<span style="font-family: SimSun">个老师</span>,<span style="font-family: SimSun">一个大叔</span>,<span style="font-family: SimSun">一个阿婆</span>,<span style="font-family: SimSun">一个老爷爷</span>.<span style="font-family: SimSun">大叔很好</span>,<span style="font-family: SimSun">提醒大家不要把生日写成今天的日期</span>~~</p>
<p><span style="font-family: SimSun">【总评】上外真的是考生必抢之地</span>,<span style="font-family: SimSun">老师允许你在休息期去厕所</span>,<span style="font-family: SimSun">不会让你憋着</span>.</p>
<p><span style="font-family: SimSun">座位虽然隔的近</span>,<span style="font-family: SimSun">但是之间有小隔断</span>,<span style="font-family: SimSun">防止作弊</span>.</p>
<p><span style="font-family: SimSun">最好还是别作弊</span>,<span style="font-family: SimSun">毕竟边上不是牛人的话</span>,<span style="font-family: SimSun">会贻误难得的考试机会</span>.</p>
<p><span style="font-family: SimSun">【听力设备】</span> <span style="font-family: SimSun">竟然考试前坏掉了，于是工作人员翻箱倒柜的找出了貌似爷爷奶奶那时候用的听力设备（虽然是耳机，但是感觉是初中学习电工的学生做的，耳套材质貌似自行车内胎</span>ONZ<span style="font-family: SimSun">，老式磁带机＋老式耳机＝象在做梦般的听力</span>T_T<span style="font-family: SimSun">&#8230;&#8230;）</span></p>
<p><span style="font-family: SimSun">【考场环境】</span>&nbsp;20<span style="font-family: SimSun">人左右容量，用的是老校舍的听力教室，外面是一条双向的小马路，考试时候（包括听力的时候）可以非常清晰、响亮的听到行人的说话声、自行车铃声、汽车喇叭声（这个声音最头疼，整个考试过程就没有断过，而且非常响，外面的马路小，所以时不时堵车，然后驾驶员就很不耐烦的按住车喇叭不放），</span> <span style="font-family: SimSun">我的听力啊、我的阅读啊当时就想抓起那古董磁带机扔向那些按喇叭的车子。</span></p>
<p><span style="font-family: SimSun">【监考态度】</span>&nbsp;<span style="font-family: SimSun">一开始只能一个一个上厕所（上好一个换一个），后来估计来不及了就全放行了（靠！）。外面那么吵，监考老师竟然在考阅读语法的最后半小时才注意到，跑过去关窗子，但是好像没有一点效果（我真怀疑那些窗子是不是没有装玻璃）。</span></p>
<p><span style="font-family: SimSun">【总评】</span>&nbsp;<span style="font-family: SimSun">听力设备算是意外，但那个考场环境心态不太好的千万别去，保证您也会抓狂！</span></p>
<p><span style="font-family: SimSun">补充一下，那栋听力大楼一进门边上竟然是厕所！而且原味十足啊</span></p>
<p><strong>1020202&nbsp;</strong><strong><span style="font-family: SimSun">华东师范大学国外考试中心</span></strong></p>
<p><strong><span style="font-family: SimSun">上海中山北路</span>3663</strong><strong><span style="font-family: SimSun">号</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 021 62545332&nbsp;&nbsp;&nbsp; 62233151&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200062&nbsp;</strong></p>
<p><strong>&nbsp;</strong></p>
<p><span style="font-family: SimSun">【听力设备】临时的耳机接线，一人一个大耳机（有些耳机质量不太好，可以换），放磁带。</span></p>
<p><span style="font-family: SimSun">【考场环境】大教室，考场容量接近</span>90<span style="font-family: SimSun">人，桌子是连在一起的，椅子坐得不舒服，空间小。</span></p>
<p><span style="font-family: SimSun">【监考态度】监考</span>4<span style="font-family: SimSun">人，中间休息</span>5<span style="font-family: SimSun">分钟，可以上厕所</span></p>
<p><span style="font-family: SimSun">【总评】听力音质还可以，就是坐的环境不舒服，容易腰酸背痛。</span></p>
<p><span style="font-family: SimSun">【考试级别】</span>1<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】学校提供的耳机，声音相当清晰，轻重正好</span></p>
<p><span style="font-family: SimSun">【考场环境】还可以，感觉桌子比较窄</span></p>
<p><span style="font-family: SimSun">【监考态度】比较严格</span></p>
<p><span style="font-family: SimSun">【总评】环境不错，厕所拥挤，听力设备好，上海考生可以作为首选</span></p>
<p><span style="font-family: SimSun">【考试级别】</span>&nbsp;3<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】</span> <span style="font-family: SimSun">小型磁带机</span>&nbsp;<span style="font-family: SimSun">（音质还可以，只是监考人员不会使用磁带机，还找了</span>3<span style="font-family: SimSun">～</span>4<span style="font-family: SimSun">个人来一起搞定，延误了</span>10<span style="font-family: SimSun">多分钟。）</span></p>
<p><span style="font-family: SimSun">【考场环境】</span>&nbsp;50<span style="font-family: SimSun">人容量</span></p>
<p><span style="font-family: SimSun">【监考态度】</span>&nbsp;<span style="font-family: SimSun">进了考场就不让上厕所，直到考试结束。（差点憋死我）</span></p>
<p><span style="font-family: SimSun">【总评】</span>&nbsp;<span style="font-family: SimSun">总体硬件还行，只是监考人员的素质有待提高。</span></p>
<p><span style="font-family: SimSun">【听力设备】磁带加扩音音响。</span></p>
<p><span style="font-family: SimSun">【考场环境】较宽敞，听力质量以磁带的水准看尚可。</span></p>
<p><span style="font-family: SimSun">【监考态度】比较严，考试答题时间卡得很紧，但中间留有上厕所的时间。</span></p>
<p><span style="font-family: SimSun">【总评】还可以，据说下次不再设在华师大位于上海市区本部了，改在上海闵行校区了。那里质量如何，暂不清楚。</span></p>
<p><span style="font-family: SimSun">【考试级别】一级</span></p>
<p><span style="font-family: SimSun">【听力设备】一人配发一个耳机</span>,<span style="font-family: SimSun">因为是串联的</span>,<span style="font-family: SimSun">所以整体调节音量</span></p>
<p><span style="font-family: SimSun">【考场环境】我坐</span>30<span style="font-family: SimSun">来个人的小教室</span>,<span style="font-family: SimSun">当天阳光不错</span>,<span style="font-family: SimSun">我靠窗</span>,<span style="font-family: SimSun">还能晒晒太阳</span>~<span style="font-family: SimSun">哈哈</span></p>
<p><span style="font-family: SimSun">【监考态度】老师很随和</span>,<span style="font-family: SimSun">做词汇的时候还提早发了</span>!<span style="font-family: SimSun">哈哈</span>!</p>
<p><span style="font-family: SimSun">【总评】不是同一个学校就一样</span>,<span style="font-family: SimSun">考场总会有各种不定因素的</span>!</p>
<p><span style="font-family: SimSun">【考试级别】二级</span></p>
<p><span style="font-family: SimSun">【听力设备】本来自带</span> <span style="font-family: SimSun">后来变成了录音机</span> <span style="font-family: SimSun">（效果不太好）</span></p>
<p><span style="font-family: SimSun">【考场环境】</span>40<span style="font-family: SimSun">人左右一个教室</span>&nbsp;<span style="font-family: SimSun">有钟</span></p>
<p><span style="font-family: SimSun">【监考态度】没啥好说</span> <span style="font-family: SimSun">很不遵守时间规定</span></p>
<p><span style="font-family: SimSun">【总评】</span>C----<span style="font-family: SimSun">以后不会再去了吧</span>&nbsp;</p>
<p>PS <span style="font-family: SimSun">考试时间不遵守规定的</span> <span style="font-family: SimSun">每个考场不一</span> <span style="font-family: SimSun">我是</span>8<span style="font-family: SimSun">点</span>40<span style="font-family: SimSun">开始</span>&nbsp;&nbsp; </p>
<p><span style="font-family: SimSun">接着导致听力在教室外面有其他题目的声音</span></p>
<p><span style="font-family: SimSun">休息也不正常</span>&nbsp;<span style="font-family: SimSun">一部分</span>3<span style="font-family: SimSun">分钟最多</span></p>
<p><span style="font-family: SimSun">【考试级别】日语</span>2<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【考点】田家炳教育书院</span></p>
<p><span style="font-family: SimSun">【听力设备】一般偏下，大广播录音，中间有</span>N<span style="font-family: SimSun">多出录音卡壳，明显带有录音痕迹，且有杂音</span></p>
<p><span style="font-family: SimSun">【考场环境】一般</span></p>
<p><span style="font-family: SimSun">【监考态度】一般</span></p>
<p><span style="font-family: SimSun">【总评】一般，听力设备不理想</span></p>
<p><span style="font-family: SimSun">【级别】</span>2<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】天花板上两个大音箱</span></p>
<p><span style="font-family: SimSun">【考场环境】算是阶梯教室了，考场</span>90<span style="font-family: SimSun">人</span></p>
<p><span style="font-family: SimSun">【监考态度】监考</span>5<span style="font-family: SimSun">名，中间可以上厕所</span></p>
<p><span style="font-family: SimSun">【总评】都还可以，就是听力设备太次，天花板上的音箱的声音传到耳朵里都糊掉了，那个男的声音几乎听不清</span></p>
<p><span style="font-family: SimSun">【听力设备】单人单用头戴式收音机。效果非常清楚，尤如听</span>mp3</p>
<p><span style="font-family: SimSun">【考场环境】较挤，课桌比较旧</span></p>
<p><span style="font-family: SimSun">【监考态度】监考两名，听力和阅读之间才可以上厕所</span></p>
<p><span style="font-family: SimSun">【总评】听力还可以，就是教室条件一般</span></p>
<p><strong>1020203&nbsp;</strong><strong><span style="font-family: SimSun">上海海事大学考试中心</span></strong></p>
<p><strong><span style="font-family: SimSun">上海浦东大道</span>1550</strong><strong><span style="font-family: SimSun">号</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 021 68532589&nbsp;&nbsp;&nbsp;&nbsp; 68539591&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200135&nbsp;</strong></p>
<p><strong>&nbsp;</strong></p>
<p><span style="font-family: SimSun">【考试级别】</span>1<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】用的是电脑直接放墙上挂着的大音箱</span>,<span style="font-family: SimSun">效果还可以</span>,<span style="font-family: SimSun">略有些杂音</span></p>
<p><span style="font-family: SimSun">【考场环境】是语音教室还可以</span></p>
<p><span style="font-family: SimSun">【监考态度】老师不错</span>,<span style="font-family: SimSun">收卷时看我还在图就先收后面的了</span>,<span style="font-family: SimSun">让我弄好再收</span></p>
<p><span style="font-family: SimSun">【总评】还可以吧</span>,<span style="font-family: SimSun">明年还去这里考</span>(<span style="font-family: SimSun">因为过不了</span>,<span style="font-family: SimSun">汗</span>)</p>
<p><span style="font-family: SimSun">【考试级别】</span>2<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】我在阶梯教室听的</span>,<span style="font-family: SimSun">清楚到是还行</span>,<span style="font-family: SimSun">不过就是有点空旷的回音</span>,<span style="font-family: SimSun">不是很影响的</span>!</p>
<p><span style="font-family: SimSun">【考场环境】中间休息没有出去过</span>,<span style="font-family: SimSun">不知道厕所情况</span>!!<span style="font-family: SimSun">教室的话</span>,<span style="font-family: SimSun">硬件还可以</span></p>
<p><span style="font-family: SimSun">【监考态度】有</span>5<span style="font-family: SimSun">个监考的</span>,2<span style="font-family: SimSun">个老一点的可能是老师</span>,<span style="font-family: SimSun">还有</span>3<span style="font-family: SimSun">个年轻的</span>,<span style="font-family: SimSun">可能是学生</span>.<span style="font-family: SimSun">态度都不好不坏</span>,<span style="font-family: SimSun">没有正面接触</span>~~</p>
<p><span style="font-family: SimSun">【总评】刚去的时候是按照准考证上面写的教室去的</span>,<span style="font-family: SimSun">可是一去发现我的教室写错了</span>.(<span style="font-family: SimSun">事先写教室的人没有看清楚我的准考证号码</span>,<span style="font-family: SimSun">搞错了</span>)<span style="font-family: SimSun">慌死我了</span>~~<span style="font-family: SimSun">还好有个年轻的考场人员告诉我</span>,<span style="font-family: SimSun">我的号码是上一个教室</span>.<span style="font-family: SimSun">事先的准备工作他们做的不缜密</span>,<span style="font-family: SimSun">不过现场工作人员还不错</span>.</p>
<p><span style="font-family: SimSun">【考试级别】一级</span></p>
<p><span style="font-family: SimSun">【考点】综合楼</span>414</p>
<p><span style="font-family: SimSun">【听力设备】统一耳机，声音较响，我不太习惯而且不能调节</span>,<span style="font-family: SimSun">但是音质还是很不错的</span>,<span style="font-family: SimSun">清晰</span></p>
<p><span style="font-family: SimSun">【考场环境】座位太挤了</span>,<span style="font-family: SimSun">考试的时候都会碰到旁边的人</span></p>
<p><span style="font-family: SimSun">【监考态度】监考老师简直就是掐着秒表宣布开考的</span>,<span style="font-family: SimSun">人不错</span></p>
<p><span style="font-family: SimSun">【总评】还可以</span></p>
<p><strong>1020204&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong><span style="font-family: SimSun">华东理工大学考试中心</span></strong></p>
<p><strong><span style="font-family: SimSun">上海市梅陇路</span>130</strong><strong><span style="font-family: SimSun">号</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 021 64250798&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200237&nbsp;</strong></p>
<p><span style="font-family: SimSun">【考试级别】</span>2<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】录音机</span></p>
<p><span style="font-family: SimSun">【考场环境】阶梯教室，位子做得比较空旷，录音机没有回音</span></p>
<p><span style="font-family: SimSun">【监考态度】一位老头子监考老师，</span>2<span style="font-family: SimSun">位女老师。态度相当不错，考每个部分的时候考场规则都会读一遍，考试时间也很仔细的提醒。每个部分结束可以上厕所，还会提醒你什么时候进教室。由于本人怕热，所以穿短袖上场，一个女老师还说：哟，你这么热呀。。。</span>OTL</p>
<p><span style="font-family: SimSun">【考试级别】</span> 3</p>
<p><span style="font-family: SimSun">【听力设备】录音机</span>,<span style="font-family: SimSun">效果还可以</span>,<span style="font-family: SimSun">就是录音有点阴阳怪气的</span></p>
<p><span style="font-family: SimSun">【考场环境】我是大考场</span>,<span style="font-family: SimSun">阶梯教室</span>,<span style="font-family: SimSun">大概有</span>100<span style="font-family: SimSun">个人左右</span></p>
<p><span style="font-family: SimSun">【监考态度】阶梯教室</span>,<span style="font-family: SimSun">监考多</span>,<span style="font-family: SimSun">有</span>6<span style="font-family: SimSun">个</span>,<span style="font-family: SimSun">管的好象很松</span>,<span style="font-family: SimSun">连准考证身份证都没核对</span></p>
<p><span style="font-family: SimSun">【总评】不错</span></p>
<p><span style="font-family: SimSun">【考试级别】</span>2</p>
<p><span style="font-family: SimSun">【听力设备】讲桌上放录音机，挺清楚地，但因教室不隔音会有其他教室放听力的干扰，</span></p>
<p><span style="font-family: SimSun">【考场环境】楼破一点，桌椅挺新，小教室坐</span>20<span style="font-family: SimSun">多人</span></p>
<p><span style="font-family: SimSun">【监考态度】老师不错，可以提前看卷子，听力也提前放了一会儿，中间休息可以待在教室里，休息的时候会发卷子，这是就可以看了，说是不能提前作，但先写了也没管</span></p>
<p><span style="font-family: SimSun">【总评】</span>85<span style="font-family: SimSun">分，总体感觉很好，老师态度也很好，就是听力有些干扰，因为其他教室听力放太大声了，稍微有点混。</span></p>
<p><strong>020205&nbsp;</strong><strong><span style="font-family: SimSun">上海交通大学外国语学院</span></strong></p>
<p><strong><span style="font-family: SimSun">上海市东川路</span>800</strong><strong><span style="font-family: SimSun">号（闵行校区）</span>&nbsp;&nbsp;&nbsp;&nbsp; 021 62933474&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200030&nbsp;</strong></p>
<p><span style="font-family: SimSun">【听力设备】大教室里的广播用大喇叭（比较清楚，考不好关键在自己）</span></p>
<p><span style="font-family: SimSun">【考场环境】不错（考生虽然多了点）</span></p>
<p><span style="font-family: SimSun">【监考态度】很随和（两个学生）</span></p>
<p><span style="font-family: SimSun">【总评】还不错，就是你必须去徐汇校区拿了准考证在去闵行考试，来回要奔波一下</span></p>
<p><span style="font-family: SimSun">【考试级别】</span>2</p>
<p><span style="font-family: SimSun">【听力设备】外放音箱</span>,<span style="font-family: SimSun">還不錯</span>,<span style="font-family: SimSun">覺得聽的蠻清楚的</span>,<span style="font-family: SimSun">雜音也不多</span>,<span style="font-family: SimSun">不過我坐比較中間位置</span>,<span style="font-family: SimSun">不知道坐後面的怎麼樣</span></p>
<p><span style="font-family: SimSun">【考场环境】算是蠻乾淨的</span>,<span style="font-family: SimSun">而且</span>50<span style="font-family: SimSun">、</span>60<span style="font-family: SimSun">人左右的大教室</span>,<span style="font-family: SimSun">看上去也不是很擠</span>,<span style="font-family: SimSun">就是椅子非常硬</span>,3<span style="font-family: SimSun">個多小時考得我那叫一個腰酸背痛結果還沒考出來</span></p>
<p><span style="font-family: SimSun">【监考态度】</span>3<span style="font-family: SimSun">个人</span>,<span style="font-family: SimSun">態度各方面都還可以</span>,<span style="font-family: SimSun">也不是管得特別緊</span>,<span style="font-family: SimSun">每段考試中間休息</span>15<span style="font-family: SimSun">分鐘</span>,<span style="font-family: SimSun">可以去上廁所</span>,<span style="font-family: SimSun">不過考試的時候貌似隱約感覺有類似閃光燈一樣的亮了一下</span>,<span style="font-family: SimSun">至今</span>8<span style="font-family: SimSun">曉得是什麼事</span>,<span style="font-family: SimSun">難道是我的錯覺麼</span>?</p>
<p><span style="font-family: SimSun">【总评】整體還算可以的</span>,<span style="font-family: SimSun">明年再奮斗的話還會考慮報那裡</span>,<span style="font-family: SimSun">就是交通不太方便</span>,<span style="font-family: SimSun">我們家到那裡得</span>1<span style="font-family: SimSun">號線換</span>5<span style="font-family: SimSun">號線</span>,<span style="font-family: SimSun">再攔量車過去</span>,<span style="font-family: SimSun">結果考完出來後根本沒車攔</span>,<span style="font-family: SimSun">只能走了</span>N<span style="font-family: SimSun">多路去換</span>5<span style="font-family: SimSun">號線</span>,<span style="font-family: SimSun">那車叫一個擠啊</span>,<span style="font-family: SimSun">整個花了我快</span>3<span style="font-family: SimSun">個小時才到的家</span></p>
<p><span style="font-family: SimSun">【考试级别】一级</span></p>
<p><span style="font-family: SimSun">【听力设备】两个大喇叭</span>,<span style="font-family: SimSun">这次很不幸</span>,<span style="font-family: SimSun">喇叭坏掉两次</span></p>
<p><span style="font-family: SimSun">【考场环境】教师倒是很大很干净</span>,<span style="font-family: SimSun">就是座位不能移动</span>,<span style="font-family: SimSun">考完屁股坐得很疼</span></p>
<p><span style="font-family: SimSun">【监考态度】监考老师完全没有经验</span>,<span style="font-family: SimSun">题目发得完了</span>,<span style="font-family: SimSun">遇到问题也不会及时处理</span></p>
<p><span style="font-family: SimSun">【总评】交通太远了</span>,<span style="font-family: SimSun">轻轨也要走好久</span>,<span style="font-family: SimSun">别的公车也不太方便</span>.<span style="font-family: SimSun">总以为喇叭总比录音机好点</span>,<span style="font-family: SimSun">结果</span>,<span style="font-family: SimSun">喇叭竟然会中途坏掉</span>...</p>
<p><span style="font-family: SimSun">【考试级别】一级</span></p>
<p><span style="font-family: SimSun">【听力设备】喇叭</span>(<span style="font-family: SimSun">不是音箱</span>)<span style="font-family: SimSun">杂音是肯定有的</span>,<span style="font-family: SimSun">但还是能听清</span></p>
<p><span style="font-family: SimSun">【考场环境】</span>50<span style="font-family: SimSun">的教室</span>,<span style="font-family: SimSun">旷工的应该有四分之一</span></p>
<p><span style="font-family: SimSun">【监考态度】二个小伙子</span>,<span style="font-family: SimSun">人不错</span>,<span style="font-family: SimSun">但不懂规矩</span>.<span style="font-family: SimSun">听力的时候</span>,<span style="font-family: SimSun">竟然像猴子一样进进出出教室</span>,<span style="font-family: SimSun">我坐门口</span>...........</p>
<p><span style="font-family: SimSun">【总评】去交大总要有点风险</span>,<span style="font-family: SimSun">总有一两个教室喇叭是会出问题的</span></p>
<p><span style="font-family: SimSun">【考试级别】</span>2</p>
<p><span style="font-family: SimSun">【考点】</span>D<span style="font-family: SimSun">楼</span>107</p>
<p><span style="font-family: SimSun">【听力设备】大喇叭</span></p>
<p><span style="font-family: SimSun">【考场环境】大概</span>60<span style="font-family: SimSun">多个人左右的大教室</span></p>
<p><span style="font-family: SimSun">【监考态度】三名监考老师，（一个老师，两个好像是研究生）休息时候可以随意出去，老师也不窃窃私语，走动得多不多我倒没注意，非常负责提醒同学填写东西不要填错。严不严倒不好说，因为自己没动歪脑筋</span>~</p>
<p><span style="font-family: SimSun">【总评】非常不错的考场，听力非常清楚，监考也非常好。</span></p>
<p><span style="font-family: SimSun">【考试级别】</span>1<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】悬挂式大喇叭</span> 2<span style="font-family: SimSun">个</span></p>
<p><span style="font-family: SimSun">【考场环境】大阶梯教室</span> <span style="font-family: SimSun">有</span>100<span style="font-family: SimSun">来号人</span></p>
<p><span style="font-family: SimSun">【监考态度】老师也就发卷子</span> <span style="font-family: SimSun">收卷子</span> <span style="font-family: SimSun">座在靠后点的</span> <span style="font-family: SimSun">如果有人认识</span> <span style="font-family: SimSun">作弊应该没问题</span> <span style="font-family: SimSun">哈哈</span> <span style="font-family: SimSun">玩笑</span></p>
<p><span style="font-family: SimSun">【总评】离市区很远</span> <span style="font-family: SimSun">早上出门要很早</span> <span style="font-family: SimSun">到了那边</span> <span style="font-family: SimSun">没有明确的指示标志</span> <span style="font-family: SimSun">而且考场蛮深的</span> <span style="font-family: SimSun">有点路程</span> <span style="font-family: SimSun">考完后大家都要挤轻轨</span> <span style="font-family: SimSun">拥堵状况实在太恐怖</span> 12<span style="font-family: SimSun">点半考完</span> <span style="font-family: SimSun">等同学</span> <span style="font-family: SimSun">一起走</span> <span style="font-family: SimSun">到家</span> <span style="font-family: SimSun">下午</span>15:30 <span style="font-family: SimSun">家在市中心</span> <span style="font-family: SimSun">所以</span> <span style="font-family: SimSun">这段路实在是太难熬了</span></p>
<p><span style="font-family: SimSun">【考试级别】</span>1<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】</span>2<span style="font-family: SimSun">个音箱，教室大所以有回音，有破音，总体效果马马虎虎吧</span></p>
<p><span style="font-family: SimSun">【考场环境】大教室</span></p>
<p><span style="font-family: SimSun">【监考态度】</span>3<span style="font-family: SimSun">个监考，中场休息可以去厕所，</span>MS<span style="font-family: SimSun">都是第</span>1<span style="font-family: SimSun">次监考，听力卷子差点没及时发&#8230;&#8230;</span></p>
<p><span style="font-family: SimSun">【总评】环境可以，监考素质不行</span></p>
<p><span style="font-family: SimSun">【考试级别】三级</span></p>
<p><span style="font-family: SimSun">【听力设备】教室里有大喇叭，音响效果不错</span></p>
<p><span style="font-family: SimSun">【考场环境】多媒体教室，共设考生</span>89<span style="font-family: SimSun">人，教室设备、环境绝对不错！</span></p>
<p><span style="font-family: SimSun">【监考态度】认真是蛮认真，就是两个男的监考有点傻，一看就是学生。</span></p>
<p><span style="font-family: SimSun">【总评】那两个男的监考真的有点傻，刚开始就答题卡发错，他们不知道答题卡上事先已经将名字打印上去的，后来收掉重新发！被那个女主考狂骂！呵呵。教室有摄像头的，一直有人监控的。有点恐怖！总的来说不错！！！</span></p>
<p><strong>1020206&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong><span style="font-family: SimSun">上海同济大学教务处</span></strong></p>
<p><strong><span style="font-family: SimSun">上海市四平路</span>1239</strong><strong><span style="font-family: SimSun">号</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 021 65983634&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200092&nbsp;</strong></p>
<p><span style="font-family: SimSun">【听力设备】自备收音机</span></p>
<p><span style="font-family: SimSun">【考场环境】硬件设施还不错，</span>20<span style="font-family: SimSun">个人左右吧</span></p>
<p><span style="font-family: SimSun">【监考态度】老师还算亲切，两个老师，就是有点马虎，差点少收了我的听力卷子</span></p>
<p><span style="font-family: SimSun">【总评】总体不错，要是今年不过，明年可以考虑再过来考</span></p>
<p><span style="font-family: SimSun">【听力设备】自备收音机</span></p>
<p><span style="font-family: SimSun">【考场环境】干净、舒适</span></p>
<p><span style="font-family: SimSun">【监考态度】老师态度很好，早</span>5<span style="font-family: SimSun">分钟发考卷。虽然老师说不许提前打题，但是只是说说而已。</span></p>
<p><span style="font-family: SimSun">【总评】感觉挺不错。</span></p>
<p><span style="font-family: SimSun">【考试级别】</span>1</p>
<p><span style="font-family: SimSun">【听力设备】自带</span>FM<span style="font-family: SimSun">调频收音机，听力的时候身体不能动，否则会影响调频，听力过程中有两三下吱吱的噪音，直接导致两道题听不清，感觉调频的方式还是让人不太放心</span></p>
<p><span style="font-family: SimSun">【考场环境】还可以</span></p>
<p><span style="font-family: SimSun">【监考态度】不严，可以提前打开试卷</span></p>
<p><span style="font-family: SimSun">【总评】听力设备不好，不推荐</span></p>
<p><span style="font-family: SimSun">没空调、中间休息时可以去上厕所监考老师是两个老太太，满和蔼可亲的</span></p>
<p><span style="font-family: SimSun">就是座位不太好，前后座位是连着的听力是有杂音，一个考场里有四五个人不能接受到。</span></p>
<p><span style="font-family: SimSun">我开始时也收不到，后来才好的</span></p>
<p><strong>1020207 </strong><strong><span style="font-family: SimSun">上海大学海外考试中心</span>&nbsp;</strong><strong><span style="font-family: SimSun">上海市上大路</span>99</strong><strong><span style="font-family: SimSun">号</span>&nbsp;021 66133195&nbsp;200444&nbsp;</strong></p>
<p><span style="font-family: SimSun">【听力设备】校方提供收音机押金</span>50<span style="font-family: SimSun">可能是电池钱</span>5<span style="font-family: SimSun">元，声音效果很好就是我都没听懂</span>&nbsp;</p>
<p><span style="font-family: SimSun">【考场环境】</span>30<span style="font-family: SimSun">人小教室环境还不错，就是一排两个人的距离太近稍微斜眼就能看到对方答题纸。</span></p>
<p><span style="font-family: SimSun">可惜和我一排的比我还弱只有他照我抄了</span></p>
<p><span style="font-family: SimSun">【监考态度】态度很好就是老师的手表慢了发卷纸不即时，还算严格吧我旁边照我抄的那位被警告过一次，不过还照样抄。</span></p>
<p><span style="font-family: SimSun">感觉不是很严。中间不许上厕所。</span></p>
<p><span style="font-family: SimSun">【总评】还可以</span></p>
<p><span style="font-family: SimSun">【考试级别】：一级</span></p>
<p><span style="font-family: SimSun">【听力设备】：上大自产的收音机（因为是上大广播台播的，频率比较低，要是有全频的收音机也可以，不强制），声音很清楚，对听力考试满好的。</span></p>
<p><span style="font-family: SimSun">【考场环境】：阶梯教室，间隔不算大，坐着很舒服，因为郊区，稍微有点冷。每部分考试中间都可以去厕所。</span></p>
<p><span style="font-family: SimSun">【监考态度】：都是年轻教师，所以比较羞涩。不大出声音，没有干扰的情况发生。</span></p>
<p><span style="font-family: SimSun">【总评】：因为是母校，特地选哪里考的。上海大学的宝山校区环境是很好的，比较干净，就是稍微远了点，但是交通还算方便，要是明年考的</span>xdjm<span style="font-family: SimSun">们还有</span>7<span style="font-family: SimSun">号线可以坐，更方便了。一三级是自带的收音机，二四级不用，可能是语音教室。</span></p>
<p><span style="font-family: SimSun">【听力设备】竟然要自己花钱去上大租！！</span></p>
<p><span style="font-family: SimSun">【考场环境】一般</span></p>
<p><span style="font-family: SimSun">【监考态度】大考场，监考老师多</span>4<span style="font-family: SimSun">个以上</span></p>
<p><span style="font-family: SimSun">【总评】上大想要前要疯了，听力考试竟然要花钱，不是上大的收音机不能收听</span></p>
<p><span style="font-family: SimSun">【听力设备】收音机，有点小杂音，基本还可以。但是收音机是以租借的方式给考生使用的，说是不准自带。在领取准考证时收取每名考生</span>55<span style="font-family: SimSun">元，说是在考试完后回收收音机再退回</span>50<span style="font-family: SimSun">块钱押金。只听</span>45<span style="font-family: SimSun">分钟就要五块钱，真黑！华南师大也是用收音机啊，音质好而且还是免费提供！</span></p>
<p><span style="font-family: SimSun">【考场环境】大考场</span>,<span style="font-family: SimSun">阶梯教室</span>,80<span style="font-family: SimSun">人一间。还算宽松。</span></p>
<p><span style="font-family: SimSun">【监考态度】监考老师</span>3<span style="font-family: SimSun">人，两男一女</span>,<span style="font-family: SimSun">监考不严，有人&#8220;侧目&#8221;</span>,<span style="font-family: SimSun">考试中可以上卫生间。其中一男为日语老师，操一口流利的吴侬口音日语。在阅读部分开考时监考老师一边回收收音机一边返还考生押金，不停发出声响。并在收音机全部回收之后在讲台数机子，讨论机子的数量问题。仿佛那里不是考场而是菜市。顿时，男人声、女人声、收音机摩擦声、塑料袋被蹂躏声</span>......<span style="font-family: SimSun">声声不绝于耳（回收过程持续超过半小时），时而还传来个别老师在门口呼唤监考老师之声</span>...... <span style="font-family: SimSun">严重影响考生情绪，众考生均怒而不言——君子报仇十年不晚。</span></p>
<p><span style="font-family: SimSun">【总评】即将邮件投诉到教育部海外考试中心</span></p>
<p><span style="font-family: SimSun">【听力设备】租借学校专用的收音机，租借费</span>50<span style="font-family: SimSun">元（事后退还），电池费</span>5<span style="font-family: SimSun">元（不退还），听力还蛮清楚地</span></p>
<p><span style="font-family: SimSun">【考场环境】偌大的阶梯教室，（教室朝北</span>12<span style="font-family: SimSun">月的时候蛮冷的，而且没有空调）因为学校太大，开考前很多人走错考场，建议预先踩点一下</span></p>
<p><span style="font-family: SimSun">【监考态度】似乎从没监考过能力考试似的</span> <span style="font-family: SimSun">考生问考场在哪里他们一问三不知</span> <span style="font-family: SimSun">问座位的大概方向也不知道，方向感差的人自求多福。</span> <span style="font-family: SimSun">最搞笑的是听力结束后第一件事不是收考卷，是一个监考拿着一叠</span>50<span style="font-family: SimSun">元人民币在考场里一个一个办理退还收音机的手续，貌似一直到考第三场阅读的时候还在退钱收收音机，考生的情绪可想而知。</span></p>
<p><span style="font-family: SimSun">【总评】</span>70<span style="font-family: SimSun">（主要是她没在我考阅读的时候来问我要收音机，不然。。。）</span></p>
<p><span style="font-family: SimSun">【听力设备】校台，清晰。（需要他们的收音机，可以借，押金考完会退，</span>5<span style="font-family: SimSun">块的手续费，推荐自己带耳机和电池）</span></p>
<p><span style="font-family: SimSun">【考场环境】环境很漂亮，这没话说。对我来说路远，而且交通恐怖，校园很大，去拿准考证的时候一定要把校园熟悉一下，牢记自己的考场位置和最方便的路线</span></p>
<p><span style="font-family: SimSun">【监考态度】监考负责！说流程和事项以外，我们的监考还特意再次提醒我们听力的答题方式（就是那个图一个对的然后图三个错的题型，他反复提醒的）</span></p>
<p><span style="font-family: SimSun">【总评】除了交通以外，其他可以说上海大学是个不错的考场！（</span>90<span style="font-family: SimSun">分吧）</span></p>
<p><span style="font-family: SimSun">去上海大学考试，给我最深印象就是：交通！条件好的同学，自己车子过去是最好的选择我认为，我是坐公交去的，说说我路途上的体会吧。</span></p>
<p><span style="font-family: SimSun">估计</span>5<span style="font-family: SimSun">点</span>45<span style="font-family: SimSun">我起床的，地铁到车站，然后去坐去上海大学的公交，是终点站，有位子坐（别小看这个位子），第一站还好，第</span>2<span style="font-family: SimSun">站开始，车厢基本</span>85%<span style="font-family: SimSun">已满，第</span> 3<span style="font-family: SimSun">站就已经饱和（买票都是前门给司机，然后去中门上车的），途中除了有个别乘客需要下车，车子基本不停站的（这也是我推荐终点站的一个比较大的理由，中途坐不上车就拖大了，</span>taxi<span style="font-family: SimSun">几乎是叫不到的），然后就这样被挤着去的，车内空气极其的浑浊，如果有轻微的晕车的同学建议带好晕车药，平时不晕或偶尔晕在那车厢里就难说了。（地铁到哪站我实在是记不起来了，真的很对不住大家）</span></p>
<p><span style="font-family: SimSun">回来：</span></p>
<p><span style="font-family: SimSun">回来我这有</span>2<span style="font-family: SimSun">个建议，一个是坐刚才那辆来的车（不是回去，而是继续乘到终点站，再从那边的终点站乘回），不然一考完，基本是挤不上车的，多出</span>2<span style="font-family: SimSun">块钱吧，省好多时间的。</span></p>
<p><span style="font-family: SimSun">第二个就是和几个同学一起拼个</span>taxi<span style="font-family: SimSun">（很多同学基本都是要去地铁的，所以很容易找的，那天我没坐</span>taxi<span style="font-family: SimSun">，所以也无法知道大概的费用是多少）</span></p>
<p><span style="font-family: SimSun">还想提一下考试中的情况（至少我的教室是这样的），情况就是，在考第</span>3<span style="font-family: SimSun">部分阅读文法时，老师会在考试期间来收取收音机和准考证（他的目的是以便考完可以直接退钱让我们早点走，当然他收取准考证只是为了退收音机钱的时候能报上我们的名字，直接还给我们的，不用担心），但我觉得这个挺烦人的，即使再轻微的动作，这样多少会有一丝让人分心的，至少对我来说是这样的。</span></p>
<p><span style="font-family: SimSun">友情提示：交通恐怖，带好吃的东西，那边几乎找不到买东西的地方的，我到家是下午近</span>4<span style="font-family: SimSun">点（我在徐汇）</span></p>
<p><span style="font-family: SimSun">【考试级别】</span> 2<span style="font-family: SimSun">级</span></p>
<p><span style="font-family: SimSun">【听力设备】</span> <span style="font-family: SimSun">中控台接到墙上的大喇叭，听力算是毁了，还有一个喇叭坏了</span></p>
<p><span style="font-family: SimSun">【考场环境】</span> <span style="font-family: SimSun">阶梯教室，人太多了，容易出状况，听力的时候还有人在刷刷地翻卷子，真想杀了那个人</span></p>
<p><span style="font-family: SimSun">【监考态度】</span> <span style="font-family: SimSun">管理较严，但是发卷子和放录音有点晚</span></p>
<p><span style="font-family: SimSun">【总评】</span> <span style="font-family: SimSun">这种地方考</span>2<span style="font-family: SimSun">级还不成问题，考</span>1<span style="font-family: SimSun">级最好要更好的听力设备</span></p>
<p><span style="font-family: SimSun">【听力设备】阶梯教室中前面两个大喇叭。</span></p>
<p><span style="font-family: SimSun">【考场环境】不怎么好，很多人缺考。</span></p>
<p><span style="font-family: SimSun">【监考态度】老师好象搞不太清楚状况，卷子都会发错。</span></p>
<p><span style="font-family: SimSun">【总评】不算很好，让我打分最多只有</span>60<span style="font-family: SimSun">分。进场之前就乱七八糟的，后来听力时先开始那个大喇叭糊涂的要死，根本就听不清楚，后来折腾了几分钟总算是清楚点了。跟我去年在华师大考时的条件比差不多了，老师也不是很敬业，卷子竟然还会发错&#8230;&#8230;严重影响我当时的发挥，哎！</span></p>
<p><strong>1020208&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong><span style="font-family: SimSun">上海财经大学</span></strong></p>
<p><strong><span style="font-family: SimSun">国定路</span>777</strong><strong><span style="font-family: SimSun">号</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 021 65651652&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200433&nbsp;</strong></p>
<p><span style="font-family: SimSun">【考试级别】二级</span></p>
<p><span style="font-family: SimSun">【听力设备】不允许自带收银机耶。。教室比较小。。所以还挺清晰的</span></p>
<p><span style="font-family: SimSun">【考场环境】破烂的桌子，而且很窄小，阳光很充足啊。。。真暖和</span></p>
<p><span style="font-family: SimSun">【监考态度】随和的老太。。提前</span>10<span style="font-family: SimSun">分钟发了卷。。我们打开做也不管，交卷后。。后面一个还在接着涂。。她就耐心的等着。。狂汗！</span></p>
<p><span style="font-family: SimSun">【总评】不错啦。。。可以考虑来年一级继续！！</span></p>
<p><span style="font-family: SimSun">【听力设备】录音机功放，磁带</span></p>
<p><span style="font-family: SimSun">【考场环境】每个考场</span>30<span style="font-family: SimSun">人，有空调</span></p>
<p><span style="font-family: SimSun">【监考态度】监考两名，每次交卷后都可以上厕所</span></p>
<p><span style="font-family: SimSun">【总评】环境还可以，就是听力设备太次</span></p>
<p><span style="font-family: SimSun">【考试级别】一级</span></p>
<p><span style="font-family: SimSun">【听力设备】录音机公放</span></p>
<p><span style="font-family: SimSun">【考场环境】每个考场大概三四十人</span>,<span style="font-family: SimSun">一教有空调</span>(<span style="font-family: SimSun">不开</span>),<span style="font-family: SimSun">二教没有空调</span>(<span style="font-family: SimSun">今年是一级在一教考</span>,<span style="font-family: SimSun">两级在二教考的</span>)</p>
<p><span style="font-family: SimSun">【监考态度】监考两名，每次交卷后都可以上厕所</span></p>
<p><span style="font-family: SimSun">【总评】环境还可以</span></p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/205316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-06-02 14:02 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/06/02/205316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Thread.interrupt 害人！ 中断JAVA线程（zz）</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/04/27/196477.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sun, 27 Apr 2008 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/04/27/196477.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/196477.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/04/27/196477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/196477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/196477.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td valign="top" width="344"><span class="text">程序是很简易的。然而，在编程人员面前，多线程呈现出了一组新的难题，如果没有被恰当的解决，将导致意外的行为以及细微的、难以发现的错误。<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在本篇文章中，我们针对这些难题之一：<span class="STYLE1">如何中断一个正在运行的线程。&nbsp;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <span class="STYLE1">背景</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;中断（Interrupt）一个线程意味着在该线程完成任务之前停止其正在进行的一切，有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步，就取决于这个程序。虽然初次看来它可能显得简单，但是，你必须进行一些预警以实现期望的结果。你最好还是牢记以下的几点告诫。<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;首先，忘掉Thread.stop方法。虽然它确实停止了一个正在运行的线程，然而，这种方法是不安全也是不受提倡的，这意味着，在未来的JAVA版本中，它将不复存在。</span></td>
        </tr>
        <tr>
            <td colspan="2" height="20"><span class="text"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;一些轻率的家伙可能被另一种方法Thread.interrupt所迷惑。尽管，其名称似乎在暗示着什么，然而，这种方法并不会中断一个正在运行的线程（待会将进一步说明），正如Listing&nbsp;A中描述的那样。它创建了一个线程，并且试图使用Thread.interrupt方法停止该线程。Thread.sleep()方法的调用，为线程的初始化和中止提供了充裕的时间。线程本身并不参与任何有用的操作。<br />
            <br />
            <pre>class Example1 extends Thread {
            boolean stop=false;
            public static void main( String args[] ) throws Exception {
            Example1 thread = new Example1();
            System.out.println( "Starting thread..." );
            thread.start();
            Thread.sleep( 3000 );
            System.out.println( "Interrupting thread..." );
            thread.interrupt();
            Thread.sleep( 3000 );
            System.out.println("Stopping application..." );
            //System.exit(0);
            }
            public void run() {
            while(!stop){
            System.out.println( "Thread is running..." );
            long time = System.currentTimeMillis();
            while((System.currentTimeMillis()-time &lt; 1000)) {
            }
            }
            System.out.println("Thread exiting under request..." );
            }
            }</pre>
            </span>
            <p class="text">如果你运行了Listing&nbsp;A中的代码，你将在控制台看到以下输出：<br />
            <br />
            Starting&nbsp;thread...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Interrupting&nbsp;thread...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Stopping&nbsp;application...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            ............................... <br />
            甚至，在Thread.interrupt()被调用后，线程仍然继续运行。<br />
            <br />
            <span class="STYLE1">真正地中断一个线程</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;中断线程最好的，最受推荐的方式是，使用共享变量（shared&nbsp;variable）发出信号，告诉线程必须停止正在运行的任务。线程必须周期性的核查这一变量（尤其在冗余操作期间），然后有秩序地中止任务。Listing&nbsp;B描述了这一方式。<br />
            <br />
            Listing&nbsp;B<br />
            class&nbsp;Example2&nbsp;extends&nbsp;Thread&nbsp;{<br />
            <br />
            &nbsp;&nbsp;volatile&nbsp;boolean&nbsp;stop&nbsp;=&nbsp;false;<br />
            <br />
            &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(&nbsp;String&nbsp;args[]&nbsp;)&nbsp;throws&nbsp;Exception&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;Example2&nbsp;thread&nbsp;=&nbsp;new&nbsp;Example2();<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Starting&nbsp;thread..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;thread.start();<br />
            <br />
            &nbsp;&nbsp;&nbsp;Thread.sleep(&nbsp;3000&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Asking&nbsp;thread&nbsp;to&nbsp;stop..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;thread.stop&nbsp;=&nbsp;true;<br />
            <br />
            &nbsp;&nbsp;&nbsp;Thread.sleep(&nbsp;3000&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Stopping&nbsp;application..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;//System.exit(&nbsp;0&nbsp;);<br />
            <br />
            &nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(&nbsp;!stop&nbsp;)&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Thread&nbsp;is&nbsp;running..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;time&nbsp;=&nbsp;System.currentTimeMillis();<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(&nbsp;(System.currentTimeMillis()-time&nbsp;&lt;&nbsp;1000)&nbsp;&amp;&amp;&nbsp;(!stop)&nbsp;)&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Thread&nbsp;exiting&nbsp;under&nbsp;request..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;}<br />
            <br />
            }<br />
            &nbsp;<br />
            运行Listing&nbsp;B中的代码将产生如下输出（注意线程是如何有秩序的退出的）<br />
            <br />
            Starting&nbsp;thread...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Thread&nbsp;is&nbsp;running...<br />
            <br />
            Asking&nbsp;thread&nbsp;to&nbsp;stop...<br />
            <br />
            Thread&nbsp;exiting&nbsp;under&nbsp;request...<br />
            <br />
            Stopping&nbsp;application...<br />
            <br />
            &nbsp;&nbsp;&nbsp;虽然该方法要求一些编码，但并不难实现。同时，它给予线程机会进行必要的清理工作，这在任何一个多线程应用程序中都是绝对需要的。请确认将共享变量定义成volatile&nbsp;类型或将对它的一切访问封入同步的块/方法（synchronized&nbsp;blocks/methods）中。<br />
            <br />
            到目前为止一切顺利!但是，当线程等待某些事件发生而被阻塞，又会发生什么？当然，如果线程被阻塞，它便不能核查共享变量，也就不能停止。这在许多情况下会发生，例如调用Object.wait()、ServerSocket.accept()和DatagramSocket.receive()时，这里仅举出一些。<br />
            <br />
            他们都可能永久的阻塞线程。即使发生超时，在超时期满之前持续等待也是不可行和不适当的，所以，要使用某种机制使得线程更早地退出被阻塞的状态。<br />
            <br />
            很不幸运，不存在这样一种机制对所有的情况都适用，但是，根据情况不同却可以使用特定的技术。在下面的环节，我将解答一下最普遍的例子。<br />
            <span class="STYLE1"><br />
            使用Thread.interrupt()中断线程</span><br />
            <br />
            &nbsp;&nbsp;正如Listing&nbsp;A中所描述的，Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是，在线程受到阻塞时抛出一个中断信号，这样线程就得以退出阻塞的状态。更确切的说，如果线程被Object.wait,&nbsp;Thread.join和Thread.sleep三种方法之一阻塞，那么，它将接收到一个中断异常（InterruptedException），从而提早地终结被阻塞状态。<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;因此，如果线程被上述几种方法阻塞，正确的停止线程方式是设置共享变量，并调用interrupt()（注意变量应该先设置）。<span class="STYLE1">如果线程没有被阻塞，这时调用interrupt()将不起作用；否则，线程就将得到异常（该线程必须事先预备好处理此状况），接着逃离阻塞状态。</span>在任何一种情况中，最后线程都将检查共享变量然后再停止。Listing&nbsp;C这个示例描述了该技术。<br />
            <br />
            Listing&nbsp;C<br />
            class&nbsp;Example3&nbsp;extends&nbsp;Thread&nbsp;{<br />
            <br />
            &nbsp;&nbsp;volatile&nbsp;boolean&nbsp;stop&nbsp;=&nbsp;false;<br />
            <br />
            &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(&nbsp;String&nbsp;args[]&nbsp;)&nbsp;throws&nbsp;Exception&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;Example3&nbsp;thread&nbsp;=&nbsp;new&nbsp;Example3();<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Starting&nbsp;thread..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;thread.start();<br />
            <br />
            &nbsp;&nbsp;&nbsp;Thread.sleep(&nbsp;3000&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Asking&nbsp;thread&nbsp;to&nbsp;stop..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;thread.stop&nbsp;=&nbsp;true;//如果线程阻塞，将不会检查此变量<br />
            <br />
            &nbsp;&nbsp;&nbsp;thread.interrupt();<br />
            <br />
            &nbsp;&nbsp;&nbsp;Thread.sleep(&nbsp;3000&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Stopping&nbsp;application..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;//System.exit(&nbsp;0&nbsp;);<br />
            <br />
            &nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(&nbsp;!stop&nbsp;)&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Thread&nbsp;running..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(&nbsp;1000&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(&nbsp;InterruptedException&nbsp;e&nbsp;)&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Thread&nbsp;interrupted..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Thread&nbsp;exiting&nbsp;under&nbsp;request..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;}<br />
            <br />
            }<br />
            <br />
            一旦Listing&nbsp;C中的Thread.interrupt()被调用，线程便收到一个异常，于是逃离了阻塞状态并确定应该停止。运行以上代码将得到下面的输出：<br />
            <br />
            Starting&nbsp;thread...<br />
            <br />
            Thread&nbsp;running...<br />
            <br />
            Thread&nbsp;running...<br />
            <br />
            Thread&nbsp;running...<br />
            <br />
            Asking&nbsp;thread&nbsp;to&nbsp;stop...<br />
            <br />
            Thread&nbsp;interrupted...<br />
            <br />
            Thread&nbsp;exiting&nbsp;under&nbsp;request...<br />
            <br />
            Stopping&nbsp;application...<br />
            <br />
            <br />
            <span class="STYLE1">中断I/O操作</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;然而，如果线程在I/O操作进行时被阻塞，又会如何？I/O操作可以阻塞线程一段相当长的时间，特别是牵扯到网络应用时。例如，服务器可能需要等待一个请求（request），又或者，一个网络应用程序可能要等待远端主机的响应。<br />
            <br />
            如果你正使用通道（channels）（这是在Java&nbsp;1.4中引入的新的I/O&nbsp;API），那么被阻塞的线程将收到一个ClosedByInterruptException异常。如果情况是这样，其代码的逻辑和第三个例子中的是一样的，只是异常不同而已。<br />
            <br />
            但是，你可能正使用Java1.0之前就存在的传统的I/O，而且要求更多的工作。既然这样，Thread.interrupt()将不起作用，因为线程将不会退出被阻塞状态。Listing&nbsp;D描述了这一行为。尽管interrupt()被调用，线程也不会退出被阻塞状态<br />
            <br />
            Listing&nbsp;D<br />
            import&nbsp;java.io.*;<br />
            <br />
            class&nbsp;Example4&nbsp;extends&nbsp;Thread&nbsp;{<br />
            <br />
            &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(&nbsp;String&nbsp;args[]&nbsp;)&nbsp;throws&nbsp;Exception&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;Example4&nbsp;thread&nbsp;=&nbsp;new&nbsp;Example4();<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Starting&nbsp;thread..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;thread.start();<br />
            <br />
            &nbsp;&nbsp;&nbsp;Thread.sleep(&nbsp;3000&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Interrupting&nbsp;thread..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;thread.interrupt();<br />
            <br />
            &nbsp;&nbsp;&nbsp;Thread.sleep(&nbsp;3000&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Stopping&nbsp;application..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;//System.exit(&nbsp;0&nbsp;);<br />
            <br />
            &nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;ServerSocket&nbsp;socket;<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket&nbsp;=&nbsp;new&nbsp;ServerSocket(7856);<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(&nbsp;IOException&nbsp;e&nbsp;)&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Could&nbsp;not&nbsp;create&nbsp;the&nbsp;socket..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(&nbsp;true&nbsp;)&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Waiting&nbsp;for&nbsp;connection..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;sock&nbsp;=&nbsp;socket.accept();<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(&nbsp;IOException&nbsp;e&nbsp;)&nbsp;{<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"accept()&nbsp;failed&nbsp;or&nbsp;interrupted..."&nbsp;);<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            <br />
            &nbsp;&nbsp;}<br />
            <br />
            }<br />
            <br />
            <br />
            &nbsp;&nbsp;&nbsp;很幸运，Java平台为这种情形提供了一项解决方案，即调用阻塞该线程的套接字的close()方法。在这种情形下，如果线程被I/O操作阻塞，该线程将接收到一个SocketException异常，这与使用interrupt()方法引起一个InterruptedException异常被抛出非常相似。<br />
            <br />
            唯一要说明的是，必须存在socket的引用（reference），只有这样close()方法才能被调用。这意味着socket对象必须被共享。Listing&nbsp;E描述了这一情形。运行逻辑和以前的示例是相同的。<br />
            <br />
            Listing&nbsp;E<br />
            import&nbsp;java.net.*;<br />
            import&nbsp;java.io.*;<br />
            class&nbsp;Example5&nbsp;extends&nbsp;Thread&nbsp;{<br />
            &nbsp;&nbsp;volatile&nbsp;boolean&nbsp;stop&nbsp;=&nbsp;false;<br />
            &nbsp;&nbsp;volatile&nbsp;ServerSocket&nbsp;socket;<br />
            &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(&nbsp;String&nbsp;args[]&nbsp;)&nbsp;throws&nbsp;Exception&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;Example5&nbsp;thread&nbsp;=&nbsp;new&nbsp;Example5();<br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Starting&nbsp;thread..."&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;thread.start();<br />
            &nbsp;&nbsp;&nbsp;Thread.sleep(&nbsp;3000&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Asking&nbsp;thread&nbsp;to&nbsp;stop..."&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;thread.stop&nbsp;=&nbsp;true;<br />
            &nbsp;&nbsp;&nbsp;thread.socket.close();<br />
            &nbsp;&nbsp;&nbsp;Thread.sleep(&nbsp;3000&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Stopping&nbsp;application..."&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;//System.exit(&nbsp;0&nbsp;);<br />
            &nbsp;&nbsp;}<br />
            &nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket&nbsp;=&nbsp;new&nbsp;ServerSocket(7856);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(&nbsp;IOException&nbsp;e&nbsp;)&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Could&nbsp;not&nbsp;create&nbsp;the&nbsp;socket..."&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(&nbsp;!stop&nbsp;)&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Waiting&nbsp;for&nbsp;connection..."&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;sock&nbsp;=&nbsp;socket.accept();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(&nbsp;IOException&nbsp;e&nbsp;)&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"accept()&nbsp;failed&nbsp;or&nbsp;interrupted..."&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;System.out.println(&nbsp;"Thread&nbsp;exiting&nbsp;under&nbsp;request..."&nbsp;);<br />
            &nbsp;&nbsp;}<br />
            }<br />
            以下是运行Listing&nbsp;E中代码后的输出：<br />
            <br />
            Starting&nbsp;thread...<br />
            <br />
            Waiting&nbsp;for&nbsp;connection...<br />
            <br />
            Asking&nbsp;thread&nbsp;to&nbsp;stop...<br />
            <br />
            accept()&nbsp;failed&nbsp;or&nbsp;interrupted...<br />
            <br />
            Thread&nbsp;exiting&nbsp;under&nbsp;request...<br />
            <br />
            Stopping&nbsp;application...<br />
            <br />
            多线程是一个强大的工具，然而它正呈现出一系列难题。其中之一是如何中断一个正在运行的线程。如果恰当地实现，使用上述技术中断线程将比使用Java平台上已经提供的内嵌操作更为简单。 </p>
            </td>
        </tr>
    </tbody>
</table>
============================================<br />
<br />
Writing multithreaded programs in Java, with its built-in support for threads, is fairly straightforward. However, multithreading presents a whole set of new challenges to the programmer that, if not correctly addressed, can lead to unexpected behavior and subtle, hard-to-find errors. In this article, we address one of those challenges: how to interrupt a running thread.<br />
<br />
<span class="subhead1">Background</span><br />
Interrupting a thread means stopping what it is doing before it has completed its task, effectively aborting its current operation. Whether the thread dies, waits for new tasks, or goes on to the next step depends on the application.<br />
<br />
Although it may seem simple at first, you must take some precautions in order to achieve the desired result. There are some caveats you must be aware of as well.<br />
<br />
First of all, forget the <em>Thread.stop</em> method. Although it indeed stops a running thread, the method is unsafe and was <a href="http://java.sun.com/j2se/1.3/docs/guide/misc/threadPrimitiveDeprecation.html" target="_target">deprecated</a>, which means it may not be available in future versions of the Java.<br />
<br />
Another method that can be confusing for the unadvised is <em>Thread.interrupt</em>. Despite what its name may imply, the method does not interrupt a running thread (more on this later), as <a onclick="window.open('http://techrepublic.com.com/html/tr/sidebars/5144546-0.html','','width=680,height=600,top=0,left=0,toolbar=no,location=yes,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes')" href="http://articles.techrepublic.com.com/5100-22-5144546.html#">Listing A</a> demonstrates. It creates a thread and tries to stop it using <em>Thread.interrupt</em>. The calls to <em>Thread.sleep</em><em>(</em><em>)</em> give plenty of time for the thread initialization and termination. The thread itself does not do anything useful.<br />
<br />
If you run the code in Listing A, you should see something like this on your console:<br />
<span class="code">Starting thread...</span><br />
<span class="code">Thread is running...</span><br />
<span class="code">Thread is running...</span><br />
<span class="code">Thread is running...</span><br />
<span class="code">Interrupting thread...</span><br />
<span class="code">Thread is running...</span><br />
<span class="code">Thread is running...</span><br />
<span class="code">Thread is running...</span><br />
<span class="code">Stopping application...</span><br />
<br />
Even after <em>Thread.interrupt</em><em>()</em> is called, the thread continues to run for a while.<br />
<br />
<span class="subhead1">Really interrupting a thread</span><br />
The best, recommended way to interrupt a thread is to use a shared variable to signal that it must stop what it is doing. The thread must check the variable periodically, especially during lengthy operations, and terminate its task in an orderly manner. <a onclick="window.open('http://techrepublic.com.com/html/tr/sidebars/5144546-1.html','','width=680,height=600,top=0,left=0,toolbar=no,location=yes,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes')" href="http://articles.techrepublic.com.com/5100-22-5144546.html#">Listing B</a> demonstrates this technique.<br />
<br />
Running the code in Listing B will generate output like this (notice how the thread exits in an orderly fashion):<br />
<span class="code">Starting thread...</span><br />
<span class="code">Thread is running...</span><br />
<span class="code">Thread is running...</span><br />
<span class="code">Thread is running...</span><br />
<span class="code">Asking thread to stop...</span><br />
<span class="code">Thread exiting under request...</span><br />
<span class="code">Stopping application...</span><br />
<br />
Although this method requires some coding, it is not difficult to implement and give the thread the opportunity to do any cleanup needed, which is an absolute requirement for any multithreaded application. Just be sure to declare the shared variable as <em>volatile</em> or enclose any access to it into <em>synchronized</em> blocks/methods.<br />
<br />
So far, so good! But what happens if the thread is blocked waiting for some event? Of course, if the thread is blocked, it can't check the shared variable and can't stop. There are plenty of situations when that may occur, such as calling <em>Object.wait</em><em>()</em>, <em>ServerSocket.accept</em><em>()</em>, and <em>DatagramSocket.receive</em><em>()</em>, to name a few.<br />
<br />
They all can block the thread forever. Even if a timeout is employed, it may not be feasible or desirable to wait until the timeout expires, so a mechanism to prematurely exit the blocked state must be used.<br />
<br />
Unfortunately there is no such mechanism that works for all cases, but the particular technique to use depends on each situation. In the following sections, I'll give solutions for the most common cases.<br />
<br />
<span class="subhead1">Interrupting a thread with <em>Thread.interrupt</em><em>()</em></span><br />
As demonstrated in Listing A, the method <em>Thread.interrupt</em><em>()</em> does not interrupt a running thread. What the method actually does is to throw an interrupt if the thread is blocked, so that it exits the blocked state. More precisely, if the thread is blocked at one of the methods <em>Object.wait</em>, <em>Thread.join</em>, or <em>Thread.sleep</em>, it receives an <em>InterruptedException</em>, thus terminating the blocking method prematurely.<br />
<br />
So, if a thread blocks in one of the aforementioned methods, the correct way to stop it is to set the shared variable and then call the <em>interrupt()</em> method on it (notice that it is important to set the variable first). If the thread is not blocked, calling <em>interrupt(</em><em>)</em> will not hurt; otherwise, the thread will get an exception (the thread must be prepared to handle this condition) and escape the blocked state. In either case, eventually the thread will test the shared variable and stop. <a onclick="window.open('http://techrepublic.com.com/html/tr/sidebars/5144546-2.html','','width=680,height=600,top=0,left=0,toolbar=no,location=yes,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes')" href="http://articles.techrepublic.com.com/5100-22-5144546.html#">Listing C</a> is a simple example that demonstrates this technique.<br />
<br />
As soon as <em>Thread.interrupt</em><em>()</em> is called in Listing C, the thread gets an exception so that it escapes the blocked state and determines that it should stop. Running this code produces output like this:<br />
<span class="code">Starting thread...</span><br />
<span class="code">Thread running...</span><br />
<span class="code">Thread running...</span><br />
<span class="code">Thread running...</span><br />
<span class="code">Asking thread to stop...</span><br />
<span class="code">Thread interrupted...</span><br />
<span class="code">Thread exiting under request...</span><br />
<span class="code">Stopping application...</span><br />
<br />
<span class="subhead1">Interrupting an I/O operation</span><br />
But what happens if the thread is blocked on an I/O operation? I/O can block a thread for a considerable amount of time, particularly if network communication is involved. For example, a server may be waiting for a request, or a network application may be waiting for an answer from a remote host.<br />
<br />
If you're using channels, available with the new I/O API introduced in Java 1.4, the blocked thread will get a <em>ClosedByInterruptException</em> exception. If that is the case, the logic is the same as that used in the third example—only the exception is different.<br />
<br />
But you might be using the traditional I/O available since Java 1.0, since the new I/O is so recent and requires more work. In this case, <em>Thread.interrupt</em><em>()</em> doesn't help, since the thread will not exit the blocked state. <a onclick="window.open('http://techrepublic.com.com/html/tr/sidebars/5144546-3.html','','width=680,height=600,top=0,left=0,toolbar=no,location=yes,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes')" href="http://articles.techrepublic.com.com/5100-22-5144546.html#">Listing D</a> demonstrates that behavior. Although the <em>interrupt()</em> method is called, the thread does not exit the blocked state.<br />
<br />
Fortunately, the Java Platform provides a solution for that case by calling the <em>close()</em> method of the socket the thread is blocked in. In this case, if the thread is blocked in an I/O operation, the thread will get a <em>SocketException</em> exception, much like the <em>interrupt()</em> method causes an <em>InterruptedException</em> to be thrown.<br />
<br />
The only caveat is that a reference to the socket must be available so that its <em>close()</em> method can be called. That means the socket object must also be shared. <a onclick="window.open('http://techrepublic.com.com/html/tr/sidebars/5144546-4.html','','width=680,height=600,top=0,left=0,toolbar=no,location=yes,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes')" href="http://articles.techrepublic.com.com/5100-22-5144546.html#">Listing E</a> demonstrates this case. The logic is the same as in the examples presented so far.<br />
<br />
And here's the sample output you can expect from running Listing E:<br />
<span class="code">Starting thread...</span><br />
<span class="code">Waiting for connection...</span><br />
<span class="code">Asking thread to stop...</span><br />
<span class="code">accept() failed or interrupted...</span><br />
<span class="code">Thread exiting under request...</span><br />
<span class="code">Stopping application...</span><br />
<br />
Multithreading is a powerful tool, but it presents its own set of challenges. One of these is how to interrupt a running thread. If properly implemented, these techniques make interrupting a thread no more difficult than using the built-in operations already provided by the Java Platform.
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/196477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-04-27 16:16 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/04/27/196477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mylyn 2.0，第 1 部分: 集成的任务管理</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188558.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 25 Mar 2008 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188558.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/188558.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/188558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/188558.html</trackback:ping><description><![CDATA[http://www.ibm.com/developerworks/cn/java/j-mylyn1/
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/188558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-03-25 18:16 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mylyn 2.0，第 2 部分: 自动上下文管理</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188559.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 25 Mar 2008 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188559.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/188559.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/188559.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/188559.html</trackback:ping><description><![CDATA[http://www.ibm.com/developerworks/cn/java/j-mylyn2/
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/188559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-03-25 18:16 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>develop tools</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188555.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 25 Mar 2008 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188555.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/188555.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/188555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/188555.html</trackback:ping><description><![CDATA[<table cellspacing="5" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td valign="middle" width="19%"></td>
            <td class="fontblankbold" width="81%"><font face="Verdana, Arial, Helvetica, sans-serif">JIRA</font><br />
            <span class="fontbluesmall"><a class="fontbluesmall" href="http://www.fangwai.net/software/jira/default.htm">专业的缺陷跟踪与项目管理软件（<font face="Verdana, Arial, Helvetica, sans-serif">Issue Tracking</font>）</a></span></td>
        </tr>
        <tr>
            <td valign="middle" width="19%"><img height="46" src="http://www.fangwai.net/images/conflance.gif" width="43"  alt="" /></td>
            <td class="fontblankbold" width="81%"><font face="Verdana, Arial, Helvetica, sans-serif">Confluence</font><br />
            <span class="fontbluesmall"><a class="fontbluesmall" href="http://www.fangwai.net/software/confluence/default.htm">团队协作与知识共享（企业<font face="Verdana, Arial, Helvetica, sans-serif">Wiki</font>软件）</a></span></td>
        </tr>
        <tr>
            <td valign="middle"><img height="46" src="http://www.fangwai.net/images/bamboo.gif" width="43"  alt="" /></td>
            <td class="fontblankbold"><font face="Verdana, Arial, Helvetica, sans-serif">Bamboo</font><br />
            <span class="fontbluesmall"><a class="fontbluesmall" href="http://www.fangwai.net/software/bamboo/default.htm">持续集成服务器（<font face="Verdana, Arial, Helvetica, sans-serif">CI Build Server</font>）</a> </span></td>
        </tr>
        <tr>
            <td valign="middle"><img height="46" src="http://www.fangwai.net/images/crowd.gif" width="43"  alt="" /></td>
            <td class="fontblankbold"><font face="Verdana, Arial, Helvetica, sans-serif">Crowd</font><br />
            <span class="fontbluesmall"><a class="fontbluesmall" href="http://www.fangwai.net/software/crowd/default.htm">单点登录工具（<font face="Verdana, Arial, Helvetica, sans-serif">SSO - Simplified</font>）</a> </span></td>
        </tr>
        <tr>
            <td valign="middle"><img src="http://www.fangwai.net/images/clover.gif"  alt="" /></td>
            <td class="fontblankbold"><font face="Verdana, Arial, Helvetica, sans-serif">Clover</font><br />
            <span class="fontbluesmall"><a class="fontbluesmall" href="http://www.fangwai.net/software/clover/default.htm">强大并高度可配置的代码覆盖分析工具</a></span></td>
        </tr>
        <tr>
            <td valign="middle"><img src="http://www.fangwai.net/images/crucible.gif"  alt="" /></td>
            <td class="fontblankbold"><font face="Verdana, Arial, Helvetica, sans-serif">Crucible</font><br />
            <span class="fontbluesmall"><a class="fontbluesmall" href="http://www.fangwai.net/software/crucible/default.htm">有效的代码评审 <font face="Verdana, Arial, Helvetica, sans-serif"></font></a></span></td>
        </tr>
        <tr>
            <td valign="middle"><img src="http://www.fangwai.net/images/fisheye.gif"  alt="" /></td>
            <td class="fontblankbold"><font face="Verdana, Arial, Helvetica, sans-serif">FishEye</font><br />
            <span class="fontbluesmall"><a class="fontbluesmall" href="http://www.fangwai.net/software/fisheye/default.htm">源代码库深度查看</a> </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/188555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-03-25 18:10 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/03/25/188555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows CMD Console 字符集的修改</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/03/24/188321.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Mon, 24 Mar 2008 10:26:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/03/24/188321.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/188321.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/03/24/188321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/188321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/188321.html</trackback:ping><description><![CDATA[<font color="Red">查看Console的字符集编码： 右键 CMD的对话框标题栏，查看属性中的option -&gt; current code page<br />
<br />
修改注册表：<br />
&nbsp;[HKEY_CURRENT_USER/Console/</font>%SystemRoot%_system32_cmd.exe<font color="Red">] "CodePage"=dword:000003a8<br />
</font><br />
修改code为932--&gt;日语，936--&gt;中文GBK<br />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/188321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-03-24 18:26 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/03/24/188321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XDoclet的build.xml写法 zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/03/20/187409.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Thu, 20 Mar 2008 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/03/20/187409.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/187409.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/03/20/187409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng