<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:clearspace="http://www.jivesoftware.com/xmlns/clearspace/rss" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Main : All Content - Java ME &amp; Capuchin</title>
    <link>http://developer.sonyericsson.com/community/community/chinese_forums/java_me</link>
    <description>All Content in Java ME &amp; Capuchin</description>
    <language>en</language>
    <pubDate>Fri, 20 Nov 2009 11:47:48 GMT</pubDate>
    <generator>Clearspace 2.5.7 (http://jivesoftware.com/products/clearspace/)</generator>
    <dc:date>2009-11-20T11:47:48Z</dc:date>
    <dc:language>en</dc:language>
    <item>
      <title>转 [J2ME] MMAPI的Cannot parse this type of AMR异常之讨论</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3332</link>
      <description>&lt;!-- [DocumentBodyStart:16b1bb67-9af6-4587-bba0-5bee8508c4e5] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;&lt;h2&gt;&lt;h1 class="title_txt"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;转自&lt;/span&gt;&lt;/span&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;旁观者 - 郑昀&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;的博客 &lt;strong style="background-color: #fcfaf4;"&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/04/17/666696.aspx"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;http://blog.csdn.net/zhengyun_ustc/archive/2006/04/17/666696.aspx&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;[J2ME] MMAPI&lt;/span&gt;&lt;span&gt;的&lt;/span&gt;&lt;span lang="EN-US"&gt;Cannot parse this type of AMR&lt;/span&gt;&lt;span&gt;异常之讨论&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;郑昀&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;span&gt;草拟&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt; 20060417&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="font-size: 18pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;现象&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;首先，我们假设遇到这种错误的人们了解如何使用&lt;/span&gt;&lt;span lang="EN-US"&gt;MMAPI&lt;/span&gt;&lt;span&gt;，从而排除代码使用不当问题。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;那么在播放&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;媒体文件时遇到&lt;/span&gt;&lt;span lang="EN-US"&gt;“&lt;strong&gt;java.lang.Exception: Cannot parse this type of AMR&lt;/strong&gt;”&lt;/span&gt;&lt;span&gt;的异常错误，如果怀疑是&lt;/span&gt;&lt;span lang="EN-US"&gt;ffmpeg&lt;/span&gt;&lt;span&gt;或者其他&lt;/span&gt;&lt;span&gt;转换程序造成的话，那么你可以把&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia&lt;/span&gt;&lt;span&gt;手机自己拍摄的录像传到&lt;/span&gt;&lt;span lang="EN-US"&gt;PC&lt;/span&gt;&lt;span&gt;机上，这种文件格式就是&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;的，而且肯定是&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia&lt;/span&gt;&lt;span&gt;自己的手机程序能播放的。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;但是，我用&lt;/span&gt;&lt;span lang="EN-US"&gt;mmapi&lt;/span&gt;&lt;span&gt;在&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia S60&lt;/span&gt;&lt;span&gt;模拟器（Nokia Developer's Suite 3.0 for J2ME所携带的模拟器）上播放这种Nokia手机生成的3gp文件时依然得到&lt;/span&gt;&lt;span lang="EN-US"&gt;“&lt;strong&gt;java.lang.Exception: Cannot parse this type of AMR&lt;/strong&gt;”&lt;/span&gt;&lt;span&gt;错误，没有声音，只有视频。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;我用下面的命令行：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="94%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;Ffmpeg&lt;/strong&gt;&lt;strong&gt;转换命令&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144 -acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;或者&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176x144 -b 128 -r 15 test.3gp&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;转换出来的&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;文件，都只能够在&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia S60&lt;/span&gt;&lt;span&gt;模拟器（Nokia Developer's Suite 3.0 for J2ME所携带的模拟器）上播放视频，但没有声音，也得到了大量的&lt;/span&gt;&lt;strong&gt;java.lang.Exception: Cannot parse this type of AMR&lt;/strong&gt;&lt;span&gt;错误提示。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;我为什么要怀疑仅仅是&lt;/span&gt;&lt;span lang="EN-US"&gt;S60&lt;/span&gt;&lt;span&gt;模拟器的问题呢。因为我把转换好的&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;文件放在我的服务器上，用&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="94%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;简单的播放代码&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;player = Manager.createPlayer(url);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;player.realize();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span lang="EN-US"&gt;player.prefetch();&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;这种代码在&lt;/span&gt;&lt;strong&gt;Nokia7610&lt;/strong&gt;&lt;strong&gt;真机&lt;/strong&gt;&lt;span&gt;上运行播放这个远端资源&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://218.249.90.118/toodou/test.3gp"&gt;http://218.249.90.118/toodou/test.3gp&lt;/a&gt; &lt;/span&gt;&lt;span&gt;，结果正常地播放了，&lt;strong&gt;有声音，有图像&lt;/strong&gt;！&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;所以说明&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia 7610&lt;/span&gt;&lt;span&gt;真机的&lt;/span&gt;&lt;span lang="EN-US"&gt;MMAPI&lt;/span&gt;&lt;span&gt;对于&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;文件中的音频解析是没问题的。出问题的是&lt;/span&gt;&lt;span lang="EN-US"&gt;S60&lt;/span&gt;&lt;span&gt;模拟器（Nokia Developer's Suite 3.0 for J2ME所携带的模拟器）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:16b1bb67-9af6-4587-bba0-5bee8508c4e5] --&gt;</description>
      <pubDate>Fri, 20 Nov 2009 11:46:19 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3332</guid>
      <dc:date>2009-11-20T11:46:19Z</dc:date>
      <clearspace:dateToText>1 day, 20 hours ago</clearspace:dateToText>
    </item>
    <item>
      <title>转 [J2ME]手机流媒体之实作[附源码][与RTSP/MMS协议无关]</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3331</link>
      <description>&lt;!-- [DocumentBodyStart:bfcf5df4-d624-4c74-96f4-c845fda59a7b] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;&lt;h1 class="title_txt"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;转自&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc"&gt;旁观者 - 郑昀&lt;/a&gt;的博客&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/03/28/641991.aspx"&gt;&lt;span&gt;&lt;span&gt;http://blog.csdn.net/zhengyun_ustc/archive/2006/03/28/641991.aspx&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1 class="title_txt"&gt;  [J2ME]手机流媒体之实作[附源码][与RTSP/MMS协议无关]&lt;cite class="fav_csdnstylebykimi"&gt;&lt;/cite&gt;&lt;/h1&gt;&lt;div class="blogstory"&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="93%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="348"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;郑昀@ultrapower&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="147"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;产品名称&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="121"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;strong&gt;产品版本&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="348"&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;Keyword: JavaME Streaming Audio MMAPI&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="147"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;StreamingDemo&lt;/strong&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="121"&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;1.0.13&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt; [J2ME]现行环境下&lt;/strong&gt;&lt;strong&gt;手机&lt;/strong&gt;&lt;/p&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt;实现网络媒体的流畅实时播放&lt;/strong&gt;&lt;/p&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt;之简单演示&lt;/strong&gt;&lt;/p&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt;(StreamingDemo)&lt;/strong&gt;&lt;/p&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;我的资源：&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-src-1.0.13.rar"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt;http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-src-1.0.13.rar&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;这个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;1.0.13&lt;/span&gt;&lt;/span&gt;&lt;span&gt;版本是&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;j2me&lt;/span&gt;&lt;/span&gt;&lt;span&gt;流媒体播放思路的简单演示软件，并不是对现有的RTSP/MMS流媒体服务器的客户端实现，而是自定义算法下载来保证实时播放，可以在&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Nokia 7610&lt;/span&gt;&lt;/span&gt;&lt;span&gt;手机上真实运行。在手机上使用，请在选择连接点时选择“移动梦网”连接点。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;如果修改源代码中&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;CommandResources.java&lt;/span&gt;&lt;/span&gt;&lt;span&gt;中的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;m_bCMWAPProxy&lt;/span&gt;&lt;/span&gt;&lt;span&gt;标志使之走&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;CMNET&lt;/span&gt;&lt;/span&gt;&lt;span&gt;通道，那么能够在&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Nokia S60&lt;/span&gt;&lt;/span&gt;&lt;span&gt;的模拟器上运行。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span style="font-size: 12pt;"&gt;本源代码的大致思路来自于我上次写的三篇讨论稿&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/01/12/577347.aspx"&gt;&lt;span style="font-size: 12pt;"&gt;J2me&lt;span lang="EN-US"&gt;&lt;span lang="EN-US"&gt;流媒体技术实现讨论&lt;/span&gt;&lt;/span&gt;[1]&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/01/15/580084.aspx"&gt;&lt;span style="font-size: 12pt;"&gt;J2me&lt;span lang="EN-US"&gt;&lt;span lang="EN-US"&gt;流媒体技术实现讨论&lt;/span&gt;&lt;/span&gt;[2]&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/01/17/582121.aspx"&gt;&lt;span style="font-size: 12pt;"&gt;J2me&lt;span lang="EN-US"&gt;&lt;span lang="EN-US"&gt;流媒体技术实现讨论&lt;/span&gt;&lt;/span&gt;[3] &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;，&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;StreamingDemo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;的代码你可以借鉴，但不得用于商业用途，除非得到我的授权。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;手机jar安装包下载： &lt;br/&gt;&lt;a class="jive-link-external-small" href="http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-deployed.rar"&gt;http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-deployed.rar&lt;/a&gt;&lt;span&gt; &lt;/span&gt;&lt;br/&gt;可以将这个包中的StreamingDemo.jar传到您的手机上进行安装。 &lt;br/&gt;使用时，请选择移动梦网连接点。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span style="font-size: 12pt;"&gt;如果你想使用劈分好的媒体文件，请从&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-src-1.0.13.rar"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt;http://www.cnblogs.com/Files/zhengyun_ustc/changjin.split.rar&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 12pt;"&gt;下载。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;背景、功能&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p class="MsoNormalIndent"&gt;&lt;strong&gt;摘要&lt;/strong&gt;&lt;span&gt;：本章&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;简单描述&lt;/span&gt;&lt;strong&gt;StreamingDemo&lt;/strong&gt;&lt;span&gt;的背景、功能。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;1.1. &lt;/span&gt;&lt;span&gt;手机上的流媒体&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;很多人都在&lt;/span&gt;&lt;span lang="EN-US"&gt;j2medev.com&lt;/span&gt;&lt;span&gt;上讨论过流媒体的实现方式。&lt;/span&gt;&lt;span&gt;国外有一个人提出一种思路，并且号称在&lt;/span&gt;&lt;strong&gt;Nokia6260&lt;/strong&gt;&lt;span lang="EN-US"&gt;[&lt;/span&gt;&lt;em&gt;相关数据：诺基亚&lt;/em&gt;&lt;em&gt; 6260 Nokia62602.0 (3.0436.0) SymbianOS7.0s Series602.1 ProfileMIDP-2.0 ConfigurationCLDC-1.0&lt;/em&gt;&lt;span lang="EN-US"&gt;]&lt;/span&gt;&lt;span&gt;运行了。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;strong&gt;当然我们这里说的不是对RTSP/MMS这种主流的流媒体服务器的客户端实现，因为现在中国市场的很多很多手机的Java环境都不支持这两个协议，只有新出的某些手机才内置支持这一功能。&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;strong&gt;我们这次讲的是，在现有GPRS环境下，在现有的一两千块钱的手机条件下，如何做到流媒体实时播放呢，而且还能做到较为流畅呢？&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span lang="EN-US"&gt;2006&lt;/span&gt;&lt;span&gt;年&lt;/span&gt;&lt;span lang="EN-US"&gt;1&lt;/span&gt;&lt;span&gt;月份，我&lt;/span&gt;恰巧看到了&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;就此思路和诸位高手讨论了一下，并且写了三篇讨论稿，有了大致的思路。但一直都没有时间去测试这个思路是否可行。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;今天索性抽出了一两个小时，把这个思路写出来放在真实手机&lt;/span&gt;&lt;span lang="EN-US"&gt;/GPRS&lt;/span&gt;&lt;span&gt;网络上测试，不敢独享，遂开放代码，希望借此抛砖引玉。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;这里给出&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;StreamingDemo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;的界面，很简单，主要的线程操作和消息处理都在后台：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;a href="http://blog.csdn.net/images/blog_csdn_net/zhengyun_ustc/187902/r_Streaming.HttpConnection.JPG"&gt;&lt;img alt="Streaming.HttpConnection" id="ViewPicture.ascx_GalleryImage" src="http://blog.csdn.net/images/blog_csdn_net/zhengyun_ustc/187902/r_Streaming.HttpConnection.JPG"/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Arial;"&gt;1.2. &lt;/span&gt;&lt;/span&gt;&lt;span&gt;我所谓流媒体的功能&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;以前我们谈过：&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;第一步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;声明两个&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;，分别由两个独立的线程掌控着；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第二步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;HttpConnection&lt;/span&gt;&lt;span&gt;开始向服务器请求该&lt;/span&gt;&lt;span lang="EN-US"&gt;audio&lt;/span&gt;&lt;span&gt;文件的第一部分字节，我们定这次读取的字节数为&lt;/span&gt;&lt;span lang="EN-US"&gt;18KB&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第三步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;等第一部分数据到位后，&lt;/span&gt;&lt;span lang="EN-US"&gt;Player A&lt;/span&gt;&lt;span&gt;开始&lt;/span&gt;&lt;span lang="EN-US"&gt;realize&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span lang="EN-US"&gt;prefetch&lt;/span&gt;&lt;span&gt;，并开始播放；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第四步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;在&lt;/span&gt;&lt;span lang="EN-US"&gt;Player A&lt;/span&gt;&lt;span&gt;播放同时，&lt;/span&gt;&lt;span lang="EN-US"&gt;(18KB&lt;/span&gt;&lt;span&gt;的&lt;/span&gt;&lt;span lang="EN-US"&gt;amr&lt;/span&gt;&lt;span&gt;数据可以播放&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span&gt;秒钟&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;span lang="EN-US"&gt;HttpConnection&lt;/span&gt;&lt;span&gt;继续请求第二部分数据&lt;/span&gt;&lt;span lang="EN-US"&gt;(&lt;/span&gt;&lt;span&gt;假设&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;每秒钟传输&lt;/span&gt;&lt;span lang="EN-US"&gt;3KB&lt;/span&gt;&lt;span&gt;，那么&lt;/span&gt;&lt;span lang="EN-US"&gt;18KB&lt;/span&gt;&lt;span&gt;需要传输&lt;/span&gt;&lt;span lang="EN-US"&gt;6&lt;/span&gt;&lt;span&gt;秒，算上前后通讯损失的时间，应该不会超过&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span&gt;秒钟&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第五步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第二部分数据到位后，假设&lt;/span&gt;&lt;span lang="EN-US"&gt;Player A&lt;/span&gt;&lt;span&gt;还没有播放完&lt;/span&gt;&lt;span lang="EN-US"&gt;(&lt;/span&gt;&lt;span&gt;这需要调整你的每一部份数据字节数来使得假设成立&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;，那么将数据喂给&lt;/span&gt;&lt;span lang="EN-US"&gt;Player B&lt;/span&gt;&lt;span&gt;让它&lt;/span&gt;&lt;span lang="EN-US"&gt;realize&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span lang="EN-US"&gt;prefetch&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第六步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;Player A&lt;/span&gt;&lt;span&gt;播放完后，得到事件通知，于是让&lt;/span&gt;&lt;span lang="EN-US"&gt;Player B&lt;/span&gt;&lt;span&gt;开始播放。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;如此往复。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;大致的思路就是这样。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;这次，我们起了两个线程，一个叫做“&lt;/span&gt;&lt;span lang="EN-US"&gt;Main(&lt;/span&gt;&lt;span&gt;主&lt;/span&gt;&lt;span lang="EN-US"&gt;) &lt;/span&gt;&lt;span&gt;”，一个叫做“&lt;/span&gt;&lt;span lang="EN-US"&gt;Secondary(&lt;/span&gt;&lt;span&gt;从属&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;”，他们都掌握着一个&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;，同样一个是&lt;/span&gt;&lt;span lang="EN-US"&gt;Main Player&lt;/span&gt;&lt;span&gt;，一个是&lt;/span&gt;&lt;span lang="EN-US"&gt;Secondary Player&lt;/span&gt;&lt;span&gt;。这两个&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;的操作实际上都被&lt;/span&gt;&lt;span lang="EN-US"&gt;Audio.java&lt;/span&gt;&lt;span&gt;类完全封装好了。线程里面仅仅是调用&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;Audio.prefetchSound(m_form,&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;                                             m_isInputMusic,&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;                                             m_Sequence);&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;啦，&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;Audio.playSound(m_Sequence);&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;啦，这样就可以把媒体资源预先运算以及播放了。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;同时，还必须用到&lt;/span&gt;&lt;span lang="EN-US"&gt;PlayerListener&lt;/span&gt;&lt;span&gt;接口，来得到播放器的各种事件通知，我们需要得知每一个播放器的播放结束消息，以便作出下一步选择：是让从属线程开始播放呢，还是让主线程开始播放呢。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;PlayerListener&lt;/span&gt;&lt;span&gt;的播放结束消息&lt;/span&gt;&lt;span lang="EN-US"&gt;(&lt;strong&gt;PlayerListener.END_OF_MEDIA&lt;/strong&gt;)&lt;/span&gt;&lt;span&gt;的处理中，我们还必须用到&lt;/span&gt;&lt;span lang="EN-US"&gt;MVC&lt;/span&gt;&lt;span&gt;模式中的&lt;/span&gt;&lt;span lang="EN-US"&gt;Controller&lt;/span&gt;&lt;span&gt;，它是代码中的&lt;/span&gt;&lt;span lang="EN-US"&gt;GUIController.java&lt;/span&gt;&lt;span&gt;，它负责处理几个消息：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;l&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;EventID.EVENT_MAIN_DownloadCompleted&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;l&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;EventID.EVENT_Main_BeginToPlay&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;l&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;EventID.EVENT_SECONDARY_BeginToPlay&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;怎么综合使用这些消息和事件呢？&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;比如说，当主线程的媒体文件下载完毕后，就应该通知&lt;/span&gt;&lt;span lang="EN-US"&gt;GUIController&lt;/span&gt;&lt;span&gt;让从属线程也开始下载并加载媒体文件。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;当主线程的媒体文件播放完毕了，这时候照理说从属线程的&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;也已经预先加载好了下一个要播放的媒体文件&lt;/span&gt;&lt;span lang="EN-US"&gt;(&lt;/span&gt;&lt;span&gt;如果不行的话就应该调整媒体文件的大小了以使得下载时间和播放时间差不多&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;，就应该在&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;public void playerUpdate(Player player, String event, Object data)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;的函数处理中，让&lt;/span&gt;&lt;span lang="EN-US"&gt;Secondary Player&lt;/span&gt;&lt;span&gt;播放了。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;这次我们直接将媒体文件用讨论稿中谈及的&lt;/span&gt;&lt;span lang="EN-US"&gt;ffmpeg&lt;/span&gt;&lt;span&gt;自动切分的办法，已经辟成&lt;/span&gt;&lt;span lang="EN-US"&gt;11&lt;/span&gt;&lt;span&gt;小段的&lt;/span&gt;&lt;span lang="EN-US"&gt;AMR&lt;/span&gt;&lt;span&gt;文件了，每一个&lt;/span&gt;&lt;span lang="EN-US"&gt;AMR&lt;/span&gt;&lt;span&gt;文件都可以独立播放，连起来就是一首完整的《大长今》乐曲。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;PlayerA&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span lang="EN-US"&gt;PlayerB&lt;/span&gt;&lt;span&gt;只是周而复始的下载、预运算、播放他们罢了。只不过掌控着&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;的两个线程和主控制器，会选择时机来让这些操作次第展开。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;上面所说的逻辑，可以用下图表示：&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://static.flickr.com/48/119270221_22b37c5793.jpg"&gt;&lt;img src="http://static.flickr.com/48/119270221_22b37c5793.jpg"/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;span lang="EN-US"&gt;&lt;h1&gt;&lt;span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;2 &lt;/span&gt;使用感受&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p class="MsoNormalIndent"&gt;&lt;strong&gt;摘要&lt;/strong&gt;&lt;span&gt;：本章&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;简单描述&lt;/span&gt;&lt;strong&gt;StreamingDemo&lt;/strong&gt;&lt;strong&gt;在真实&lt;/strong&gt;&lt;strong&gt;GPRS&lt;/strong&gt;&lt;strong&gt;环境下&lt;/strong&gt;&lt;span&gt;的使用感受。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Arial;"&gt;2.1. Nokia7610&lt;/span&gt;&lt;/span&gt;&lt;span&gt;手机上的设置&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;如果你真的要在手机上用到这种功能，那么请申请开通你的&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;包月套餐，那样&lt;/span&gt;&lt;span lang="EN-US"&gt;20&lt;/span&gt;&lt;span&gt;块钱就可以使用&lt;/span&gt;&lt;span lang="EN-US"&gt;50MB&lt;/span&gt;&lt;span&gt;流量的&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;了。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;如果你的手机是&lt;/span&gt;&lt;strong&gt;Nokia&lt;/strong&gt;&lt;span&gt;的&lt;/span&gt;&lt;span lang="EN-US"&gt;S60&lt;/span&gt;&lt;span&gt;系列手机，建议用&lt;/span&gt;&lt;strong&gt;Nokia&lt;/strong&gt;&lt;strong&gt;程序管理器&lt;/strong&gt;&lt;span&gt;设置这个应用配置一个参数：&lt;strong&gt;在连接网络时第一次询问&lt;/strong&gt;。否则你会屡屡被网络连接警告框打断的。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Arial;"&gt;2.2. Nokia7610&lt;/span&gt;&lt;/span&gt;&lt;span&gt;手机上的使用感受&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;这种流媒体的播放，还是取决于使用时&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;网络的好坏。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;我在晚上&lt;/span&gt;&lt;span lang="EN-US"&gt;19&lt;/span&gt;&lt;span&gt;点使用了一下，感觉比较流畅，甚至超乎我的预期，不认真听，甚至感觉不到在哪里停顿的。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;但是在晚上&lt;/span&gt;&lt;span lang="EN-US"&gt;20&lt;/span&gt;&lt;span&gt;点又用了一下，就有点拖拖拉拉的，延迟较为明显。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;可见现行的&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;网络环境还是容易出现拥挤的。&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;3 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;开源版权声明&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;由于这个&lt;strong&gt;手机流媒体简单演示&lt;/strong&gt;的&lt;/span&gt;&lt;span&gt;思路和代码来自于郑昀以前的讨论稿，今为了促进&lt;/span&gt;&lt;span lang="EN-US"&gt;J2ME&lt;/span&gt;&lt;span&gt;多媒体应用发展，&lt;span&gt;决定遵照&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;GPL&lt;/span&gt;&lt;span&gt;协议的大意开放源代码，您可以自由传播和修改，在遵照下面的约束条件的前提下：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="94%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="624"&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;条件&lt;/strong&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="624"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;只要你在&lt;/span&gt;&lt;span&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;strong&gt;手机流媒体简单演示&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;span&gt;的&lt;/span&gt;&lt;span&gt;每一副本上明显和恰当地出版版权声明，保持此许可证的声明和没有担保的声明完整无损，并和程序一起给每个其他的程序接受者一份许可证的副本，你就可以用任何媒体复制和发布你收到的原始的程序的源代码。你可以为转让副本的实际行动收取一定费用，但必须事先得到郑昀的同意。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="94%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="624"&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;条件&lt;/strong&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="624"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;你可以修改&lt;/span&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;手机流媒体简单演示&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;span&gt;程序的一个或几个副本或程序的任何部分，以此形成基于程序的作品。只要你同时满足下面的所有条件，你就可以按前面第一款的要求复制和发布这一经过修改的程序或作品。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;你必须在修改的文件中附有明确的说明：你修改了这一文件及具体的修改日期。&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;你必须使你发布或出版的作品（它包含程序的全部或一部分，或包含由程序的全部或部分衍生的作品）允许第三方作为整体按许可证条款免费使用。&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;如果修改的程序在运行时以交互方式读取命令，你必须使它在开始进入常规的交互使用方式时打印或显示声明：包括适当的版权声明和没有担保的声明（或者你提供担保的声明）；用户可以按此许可证条款重新发布程序的说明；并告诉用户如何看到这一许可证的副本。（例外的情况：如果原始程序以交互方式工作，它并不打印这样的声明，你的基于程序的作品也就不用打印声明）。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;这样，您就可以自由使用并传播本源代码，&lt;strong&gt;当然请您原封不动地保留创建者&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;zhengyun_ustc(&lt;/strong&gt;&lt;strong&gt;郑昀&lt;/strong&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;strong&gt;的作者信息&lt;/strong&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:bfcf5df4-d624-4c74-96f4-c845fda59a7b] --&gt;</description>
      <pubDate>Fri, 20 Nov 2009 11:42:52 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3331</guid>
      <dc:date>2009-11-20T11:42:52Z</dc:date>
      <clearspace:dateToText>1 day, 20 hours ago</clearspace:dateToText>
    </item>
    <item>
      <title>Java ME中如何录制比支持视频格式更小的视频？</title>
      <link>http://developer.sonyericsson.com/community/message/129401</link>
      <description>&lt;!-- [DocumentBodyStart:b15ab63f-7125-4c25-9a75-cbe83aca0153] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;很强大。这些我都没研究过。搞好了写个总结上来撒。&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:b15ab63f-7125-4c25-9a75-cbe83aca0153] --&gt;</description>
      <pubDate>Thu, 19 Nov 2009 07:03:39 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/message/129401</guid>
      <dc:date>2009-11-19T07:03:39Z</dc:date>
      <clearspace:dateToText>3 days, 1 hour ago</clearspace:dateToText>
      <clearspace:replyCount>2</clearspace:replyCount>
    </item>
    <item>
      <title>Java Verified 手册</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3329</link>
      <description>&lt;!-- [DocumentBodyStart:107ca524-0eed-4d70-9369-961393bec462] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;    本手册将逐步指导您实现，如何通过 Java Verified 提交门户网站提交应用软件进行认证，并简要介绍提交门户网站能为已提交的软件提供哪些服务。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;    它将带您通过认证流程涉及的所有步骤，包括从获取 Publisher ID 到最终在线提交应用软件进行测试与签名。&lt;/span&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;目录&lt;/span&gt;&lt;/strong&gt;&lt;br/&gt;1. 本手册的用途&lt;br/&gt;2. 什么是 Java Verified 提交门户网站？&lt;br/&gt;3. 什么是 Publisher ID？我该如何使用它？&lt;br/&gt;4. 我该如何注册使用提交门户网站？&lt;br/&gt;5. 在提交应用软件之前我需要做些什么？&lt;br/&gt;6. 我该如何将应用软件提交到门户网站？&lt;br/&gt;7. 我该如何提交应用软件进行研发签名？&lt;br/&gt;8. 我该如何提交应用软件进行测试与签名？&lt;br/&gt;9. 我该如何在门户网站上找到提交的内容？&lt;br/&gt;附录 A: 签署多个 JAD / JAR 文件对的脚本示例&lt;br/&gt;附录 B: 常见问题解答&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;关于如何在索尼爱立信手机上进行 Java 签名和 Java 的权限设置，请阅读下面的文章&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;a class="jive-link-wiki-small" href="http://developer.sonyericsson.com/community/docs/DOC-3059"&gt;索尼爱立信手机 Java ME 签名指南&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="jive-link-wiki-small" href="http://developer.sonyericsson.com/community/docs/DOC-3018"&gt;索尼爱立信手机的 Java ME 的权限设置&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;更多信息&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;a class="jive-link-external-small" href="http://developer.sonyericsson.com/site/zhcn/techsupport/javaverified/p_javaverified.jsp"&gt;http://developer.sonyericsson.com/site/zhcn/techsupport/javaverified/p_javaverified.jsp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="jive-link-external-small" href="http://www.javaverified.com"&gt;http://www.javaverified.com&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:107ca524-0eed-4d70-9369-961393bec462] --&gt;</description>
      <pubDate>Tue, 17 Nov 2009 09:30:37 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3329</guid>
      <dc:date>2009-11-17T09:30:37Z</dc:date>
      <clearspace:dateToText>4 days, 22 hours ago</clearspace:dateToText>
    </item>
    <item>
      <title>CAPUCHIN中在FLASH CS3中可以实现ACCELEROMETER感应游戏吗？</title>
      <link>http://developer.sonyericsson.com/community/message/129347</link>
      <description>&lt;!-- [DocumentBodyStart:d07b41a4-7e24-4d23-8912-1af69a2d841a] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;&lt;p&gt;这个可见参见相关文档：&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;数据传输接口以及相应的类和功能指令应当在真实的Flash Lite和Java应用程序开始开发前就定义完毕。&lt;/p&gt;&lt;p&gt;存在两种类型的数据传输方法：&lt;/p&gt;&lt;p&gt;• DataRequest. 由MIDlet处理一个来自Flash Lite应用程序的数据请求，数据回馈不同步。为处理这个请求，MIDlet可以使用手机Java平台上可用的任何JSRs。&lt;/p&gt;&lt;p&gt;• ExtendedEvent. Flash Lite内容接收由MIDlet激发的事件。&lt;/p&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体的用法得看例子学习了，capuchin在一定程度上对j2me有很大的帮助，但是这个刚推出业不久，希望能在这多多交流&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;h4 class="docidlink"&gt;&lt;a class="jive-link-external-small" href="http://developer.sonyericsson.com/getDocument.do?docId=100932"&gt;面向 Flash Lite 和 Java 开发者的 Capuchin 计划入门指南 适用于索尼爱立信手机 (1.57 MB)&lt;/a&gt;&lt;/h4&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:d07b41a4-7e24-4d23-8912-1af69a2d841a] --&gt;</description>
      <pubDate>Mon, 16 Nov 2009 14:51:03 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/message/129347</guid>
      <dc:date>2009-11-16T14:51:03Z</dc:date>
      <clearspace:dateToText>5 days, 17 hours ago</clearspace:dateToText>
      <clearspace:replyCount>1</clearspace:replyCount>
    </item>
    <item>
      <title>关于java进行flash播放的问题</title>
      <link>http://developer.sonyericsson.com/community/message/129346</link>
      <description>&lt;!-- [DocumentBodyStart:9c887bd1-f81b-45a9-8ffa-68009ce67ffd] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;查了一下相关资料，没有看到有相关的支持的说明。目前只能在支持cauchin的手机才能支持&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:9c887bd1-f81b-45a9-8ffa-68009ce67ffd] --&gt;</description>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=14&amp;container=2023">capuchin</category>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=14&amp;container=2023">j2me</category>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=14&amp;container=2023">jp-8</category>
      <pubDate>Mon, 16 Nov 2009 14:29:47 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/message/129346</guid>
      <dc:date>2009-11-16T14:29:47Z</dc:date>
      <clearspace:dateToText>5 days, 17 hours ago</clearspace:dateToText>
      <clearspace:replyCount>1</clearspace:replyCount>
    </item>
    <item>
      <title>关于索爱手机读取生日字段的问题</title>
      <link>http://developer.sonyericsson.com/community/message/129312</link>
      <description>&lt;!-- [DocumentBodyStart:b20d2bef-3681-4292-b015-41c4a7c72979] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;1970年是unix系统发布的时间，很多系统都是拿那个时间开始计算的，比如linux,它的内核时间记寻的是与1970年相差的时间，java得到当前时间也是如此，如果系统有问题，你在存时试用自己的算法去存，读的时候再进行还原，看成不成&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:b20d2bef-3681-4292-b015-41c4a7c72979] --&gt;</description>
      <pubDate>Sat, 14 Nov 2009 14:25:09 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/message/129312</guid>
      <dc:date>2009-11-14T14:25:09Z</dc:date>
      <clearspace:dateToText>1 week, 17 hours ago</clearspace:dateToText>
      <clearspace:replyCount>4</clearspace:replyCount>
    </item>
    <item>
      <title>Java线程的同步</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3323</link>
      <description>&lt;!-- [DocumentBodyStart:fe440b7f-7a7a-4bb8-84d1-b6976e30c9bd] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;在J2ME开发中，线程是一个需要非常重视的问题，下面是一段关于线程的文章。我认为对打好线程基本很有帮助。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;zz &lt;/span&gt;&lt;a class="jive-link-external-small" href="http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=5478"&gt;http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=5478&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;div align="left"&gt;&lt;strong&gt;一、同步问题提出&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;线程的同步是为了防止多个线程访问一个数据对象时，对数据造成的破坏。&lt;/div&gt;&lt;div align="left"&gt;例如：两个线程ThreadA、ThreadB都操作同一个对象Foo对象，并修改Foo对象上的数据。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Foo { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x = 100; &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; getX() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; x; &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; fix(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; y) { &lt;br/&gt;        x = x - y; &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; x; &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MyRunnable &lt;span style="color: #0000ff;"&gt;implements&lt;/span&gt; Runnable { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Foo foo = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Foo(); &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; main(String[] args) { &lt;br/&gt;        MyRunnable r = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MyRunnable(); &lt;br/&gt;        Thread ta = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(r, &lt;span style="color: #800000;"&gt;"Thread-A"&lt;/span&gt;); &lt;br/&gt;        Thread tb = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(r, &lt;span style="color: #800000;"&gt;"Thread-B"&lt;/span&gt;); &lt;br/&gt;        ta.start(); &lt;br/&gt;        tb.start(); &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; run() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 3; i++) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.fix(30); &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; { &lt;br/&gt;                Thread.sleep(1); &lt;br/&gt;            } &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (InterruptedException e) { &lt;br/&gt;                e.printStackTrace(); &lt;br/&gt;            } &lt;br/&gt;            System.out.println(Thread.currentThread().getName() + &lt;span style="color: #800000;"&gt;" : 当前foo对象的x值= "&lt;/span&gt; + foo.getX()); &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; fix(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; y) { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; foo.fix(y); &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;运行结果：&lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;Thread-A : 当前foo对象的x值= 40 &lt;br/&gt;Thread-B : 当前foo对象的x值= 40 &lt;br/&gt;Thread-B : 当前foo对象的x值= -20 &lt;br/&gt;Thread-A : 当前foo对象的x值= -50 &lt;br/&gt;Thread-A : 当前foo对象的x值= -80 &lt;br/&gt;Thread-B : 当前foo对象的x值= -80 &lt;br/&gt;&lt;br/&gt;Process finished with exit code 0&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;从结果发现，这样的输出值明显是不合理的。原因是两个线程不加控制的访问Foo对象并修改其数据所致。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;如果要保持结果的合理性，只需要达到一个目的，就是将对Foo的访问加以限制，每次只能有一个线程在访问。这样就能保证Foo对象中数据的合理性了。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;在具体的Java代码中需要完成一下两个操作：&lt;/div&gt;&lt;div align="left"&gt;把竞争访问的资源类Foo变量x标识为private；&lt;/div&gt;&lt;div align="left"&gt;同步哪些修改变量的代码，使用synchronized关键字同步方法或代码。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;二、同步和锁定&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;1、锁的原理&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;Java中每个对象都有一个内置锁&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当程序运行到非静态的synchronized同步方法上时，自动获得与正在执行代码类的当前实例（this实例）有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当程序运行到synchronized同步方法或代码块时才该对象锁才起作用。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;一个对象只有一个锁。所以，如果一个线程获得该锁，就没有其他线程可以获得锁，直到第一个线程释放（或返回）锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块，直到该锁被释放。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;释放锁是指持锁线程退出了synchronized同步方法或代码块。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;关于锁和同步，有一下几个要点：&lt;/div&gt;&lt;div align="left"&gt;1）、只能同步方法，而不能同步变量和类；&lt;/div&gt;&lt;div align="left"&gt;2）、每个对象只有一个锁；当提到同步时，应该清楚在什么上同步？也就是说，在哪个对象上同步？&lt;/div&gt;&lt;div align="left"&gt;3）、不必同步类中所有的方法，类可以同时拥有同步和非同步方法。&lt;/div&gt;&lt;div align="left"&gt;4）、如果两个线程要执行一个类中的synchronized方法，并且两个线程使用相同的实例来调用方法，那么一 次只能有一个线程能够执行方法，另一个需要等待，直到锁被释放。也就是说：如果一个线程在对象上获得一个锁，就没有任何其他线程可以进入（该对象的）类中 的任何一个同步方法。&lt;/div&gt;&lt;div align="left"&gt;5）、如果线程拥有同步和非同步方法，则非同步方法可以被多个线程自由访问而不受锁的限制。&lt;/div&gt;&lt;p align="left"&gt;6）、线程睡眠时，它所持的任何锁都不会释放。&lt;/p&gt;&lt;div align="left"&gt;7）、线程可以获得多个锁。比如，在一个对象的同步方法里面调用另外一个对象的同步方法，则获取了两个对象的同步锁。&lt;/div&gt;&lt;div align="left"&gt;8）、同步损害并发性，应该尽可能缩小同步范围。同步不但可以同步整个方法，还可以同步方法中一部分代码块。&lt;/div&gt;&lt;div align="left"&gt;9）、在使用同步代码块时候，应该指定在哪个对象上同步，也就是说要获取哪个对象的锁。例如：&lt;/div&gt;&lt;div align="left"&gt;    public int fix(int y) {&lt;br/&gt;        synchronized (this) {&lt;br/&gt;            x = x - y;&lt;br/&gt;        }&lt;br/&gt;        return x;&lt;br/&gt;    }&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当然，同步方法也可以改写为非同步方法，但功能完全一样的，例如：&lt;/div&gt;&lt;div align="left"&gt;    public synchronized int getX() {&lt;br/&gt;        return x++;&lt;br/&gt;    }&lt;/div&gt;&lt;div align="left"&gt;与&lt;/div&gt;&lt;div align="left"&gt;    public int getX() {&lt;br/&gt;        synchronized (this) {&lt;br/&gt;            return x;&lt;br/&gt;        }&lt;br/&gt;    }&lt;/div&gt;&lt;div align="left"&gt;效果是完全一样的。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;三、静态方法同步&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;要同步静态方法，需要一个用于整个类对象的锁，这个对象是就是这个类（XXX.class)。&lt;/div&gt;&lt;div align="left"&gt;例如：&lt;/div&gt;&lt;div align="left"&gt;public static synchronized int setName(String name){&lt;/div&gt;&lt;div align="left"&gt;      Xxx.name = name;&lt;/div&gt;&lt;div align="left"&gt;}&lt;/div&gt;&lt;div align="left"&gt;等价于&lt;br/&gt;public static int setName(String name){&lt;br/&gt;      synchronized(Xxx.class){&lt;br/&gt;            Xxx.name = name;&lt;br/&gt;      }&lt;br/&gt;}&lt;/div&gt;&lt;div align="left"&gt;&lt;br/&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;四、如果线程不能不能获得锁会怎么样&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;如果线程试图进入同步方法，而其锁已经被占用，则线程在该对象上被阻塞。实质上，线程进入该对象的的一种池中，必须在哪里等待，直到其锁被释放，该线程再次变为可运行或运行为止。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当考虑阻塞时，一定要注意哪个对象正被用于锁定：&lt;/div&gt;&lt;div align="left"&gt;1、调用同一个对象中非静态同步方法的线程将彼此阻塞。如果是不同对象，则每个线程有自己的对象的锁，线程间彼此互不干预。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;2、调用同一个类中的静态同步方法的线程将彼此阻塞，它们都是锁定在相同的Class对象上。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;3、静态同步方法和非静态同步方法将永远不会彼此阻塞，因为静态方法锁定在Class对象上，非静态方法锁定在该类的对象上。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;4、对于同步代码块，要看清楚什么对象已经用于锁定（synchronized后面括号的内容）。在同一个对象上进行同步的线程将彼此阻塞，在不同对象上锁定的线程将永远不会彼此阻塞。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;五、何时需要同步&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;在多个线程同时访问互斥（可交换）数据时，应该同步以保护数据，确保两个线程不会同时修改更改它。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;对于非静态字段中可更改的数据，通常使用非静态方法访问。&lt;/div&gt;&lt;div align="left"&gt;对于静态字段中可更改的数据，通常使用静态方法访问。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;如果需要在非静态方法中使用静态字段，或者在静态字段中调用非静态方法，问题将变得非常复杂。已经超出SJCP考试范围了。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;六、线程安全类&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当一个类已经很好的同步以保护它的数据时，这个类就称为“线程安全的”。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;即使是线程安全类，也应该特别小心，因为操作的线程是间仍然不一定安全。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;举个形象的例子，比如一个集合是线程安全的，有两个线程在操作同一个集合对象，当第一个线程查询集合非空后，删除集 合中所有元素的时候。第二个线程也来执行与第一个线程相同的操作，也许在第一个线程查询后，第二个线程也查询出集合非空，但是当第一个执行清除后，第二个 再执行删除显然是不对的，因为此时集合已经为空了。&lt;/div&gt;&lt;div align="left"&gt;看个代码：&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; NameList { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; List nameList = Collections.synchronizedList(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; LinkedList()); &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; add(String name) { &lt;br/&gt;        nameList.add(name); &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; String removeFirst() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (nameList.size() &amp;gt; 0) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (String) nameList.remove(0); &lt;br/&gt;        } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;; &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Test { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; main(String[] args) { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; NameList nl = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; NameList(); &lt;br/&gt;        nl.add(&lt;span style="color: #800000;"&gt;"aaa"&lt;/span&gt;); &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; NameDropper &lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt; Thread{ &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; run(){ &lt;br/&gt;                String name = nl.removeFirst(); &lt;br/&gt;                System.out.println(name); &lt;br/&gt;            } &lt;br/&gt;        } &lt;br/&gt;&lt;br/&gt;        Thread t1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; NameDropper(); &lt;br/&gt;        Thread t2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; NameDropper(); &lt;br/&gt;        t1.start(); &lt;br/&gt;        t2.start(); &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;虽然集合对象&lt;/div&gt;&lt;div align="left"&gt;    private List nameList = Collections.synchronizedList(new LinkedList());&lt;br/&gt;是同步的，但是程序还不是线程安全的。&lt;/div&gt;&lt;div align="left"&gt;出现这种事件的原因是，上例中一个线程操作列表过程中无法阻止另外一个线程对列表的其他操作。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;解决上面问题的办法是，在操作集合对象的NameList上面做一个同步。改写后的代码如下：&lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; NameList { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; List nameList = Collections.synchronizedList(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; LinkedList()); &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; add(String name) { &lt;br/&gt;        nameList.add(name); &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; String removeFirst() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (nameList.size() &amp;gt; 0) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (String) nameList.remove(0); &lt;br/&gt;        } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;; &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;这样，当一个线程访问其中一个同步方法时，其他线程只有等待。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;七、线程死锁&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;死锁对Java程序来说，是很复杂的，也很难发现问题。当两个线程被阻塞，每个线程在等待另一个线程时就发生死锁。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;还是看一个比较直观的死锁例子：&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DeadlockRisk { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Resource { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; value; &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Resource resourceA = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Resource(); &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Resource resourceB = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Resource(); &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; read() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; (resourceA) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; (resourceB) { &lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; resourceB.value + resourceA.value; &lt;br/&gt;            } &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; write(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b) { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; (resourceB) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; (resourceA) { &lt;br/&gt;                resourceA.value = a; &lt;br/&gt;                resourceB.value = b; &lt;br/&gt;            } &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;假设read()方法由一个线程启动，write()方法由另外一个线程启动。读线程将拥有resourceA锁，写线程将拥有resourceB锁，两者都坚持等待的话就出现死锁。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;实际上，上面这个例子发生死锁的概率很小。因为在代码内的某个点，CPU必须从读线程切换到写线程，所以，死锁基本上不能发生。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;但是，无论代码中发生死锁的概率有多小，一旦发生死锁，程序就死掉。有一些设计方法能帮助避免死锁，包括始终按照预定义的顺序获取锁这一策略。已经超出SCJP的考试范围。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;八、线程同步小结&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;1、线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏。&lt;/div&gt;&lt;div align="left"&gt;2、线程同步方法是通过锁来实现，每个对象都有切仅有一个锁，这个锁与一个特定的对象关联，线程一旦获取了对象锁，其他访问该对象的线程就无法再访问该对象的其他非同步方法。&lt;/div&gt;&lt;div align="left"&gt;3、对于静态同步方法，锁是针对这个类的，锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁，当在一个同步方法中访问另外对象上的同步方法时，会获取这两个对象锁。&lt;/div&gt;&lt;div align="left"&gt;4、对于同步，要时刻清醒在哪个对象上同步，这是关键。&lt;/div&gt;&lt;div align="left"&gt;5、编写线程安全的类，需要时刻注意对多个线程竞争访问资源的逻辑和安全做出正确的判断，对“原子”操作做出分析，并保证原子操作期间别的线程无法访问竞争资源。&lt;/div&gt;&lt;div align="left"&gt;6、当多个线程等待一个对象锁时，没有获取到锁的线程将发生阻塞。&lt;/div&gt;&lt;div align="left"&gt;7、死锁是线程间相互等待锁锁造成的，在实际中发生的概率非常的小。真让你写个死锁程序，不一定好使，呵呵。但是，一旦程序发生死锁，程序将死掉。&lt;/div&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:fe440b7f-7a7a-4bb8-84d1-b6976e30c9bd] --&gt;</description>
      <pubDate>Wed, 11 Nov 2009 01:38:50 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3323</guid>
      <dc:date>2009-11-11T01:38:50Z</dc:date>
      <clearspace:dateToText>1 week, 4 days ago</clearspace:dateToText>
    </item>
    <item>
      <title>J2ME怎么压缩图片？</title>
      <link>http://developer.sonyericsson.com/community/message/129081</link>
      <description>&lt;!-- [DocumentBodyStart:e95c75c9-9b92-4399-857a-92e573b17e47] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;嗯，这样做确实不错。不过总是感觉用户体验上有点差。另外现在手机的照相机越来越强大，图片也越来越大，不压缩直接传，一个很大的图片很容易传不上去&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:e95c75c9-9b92-4399-857a-92e573b17e47] --&gt;</description>
      <pubDate>Thu, 05 Nov 2009 05:34:04 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/message/129081</guid>
      <dc:date>2009-11-05T05:34:04Z</dc:date>
      <clearspace:dateToText>2 weeks, 3 days ago</clearspace:dateToText>
      <clearspace:replyCount>8</clearspace:replyCount>
    </item>
    <item>
      <title>索爱SDK2.5.0.6仍未支持运行Capuchin计划？</title>
      <link>http://developer.sonyericsson.com/community/message/129064</link>
      <description>&lt;!-- [DocumentBodyStart:1590b5d8-3e2a-4599-86a1-2f5e5d2c8683] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;客气，相互交流而已，欢迎多来发帖&lt;img height="16px" src="http://developer.sonyericsson.com/community/images/emoticons/laugh.gif" width="16px"/&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:1590b5d8-3e2a-4599-86a1-2f5e5d2c8683] --&gt;</description>
      <pubDate>Wed, 04 Nov 2009 06:05:25 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/message/129064</guid>
      <dc:date>2009-11-04T06:05:25Z</dc:date>
      <clearspace:dateToText>2 weeks, 4 days ago</clearspace:dateToText>
      <clearspace:replyCount>3</clearspace:replyCount>
    </item>
  </channel>
</rss>

