首页 文档 博客 资源 论坛 |
雪峰的JavaEE博客
研究、思考、探索
访问地址:http://xuefeng.javaeedev.com » 复制 » 收藏 » 订阅
博客首页 » 最新文章
发表于07-05-15 14:49 | 阅读 926 | 评分 (暂无)
多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每个人都是一个线程。当A希望进入房间时,他必须获得门锁,一旦A获得门锁,他进去后就立刻将门锁上,于是B,C,D...就不得不在门外等待,直到A释放锁出来后,B,C,D...中的某一人抢到了该锁(具体抢法依赖于 JVM的实现,可以先到先得,也可以随机挑选),然后进屋又将门锁上。这样,任一时刻最多有一人在屋内(使用共享资源)。 Java语言规范内置了对多线程的支持。对于Java程序来说,每一个对象实例都有一把“锁”,一旦某个线程获得了该锁,别的线程如果希望获得该锁,只能等待这个线程释放锁之后。获得锁的方法只有一个,就是synchronized关键字。例如: public class SharedResource { private int count = 0; public int getCount() { return count; } public synchronized void setCount(int count) { this.count = co ...
发表于07-05-15 14:47 | 阅读 726 | 评分 (暂无)
由于同一进程内的多个线程共享内存空间,在Java中,就是共享实例,当多个线程试图同时修改某个实例的内容时,就会造成冲突,因此,线程必须实现共享互斥,使多线程同步。 最简单的同步是将一个方法标记为synchronized,对同一个实例来说,任一时刻只能有一个synchronized方法在执行。当一个方法正在执行某个synchronized方法时,其他线程如果想要执行这个实例的任意一个synchronized方法,都必须等待当前执行 synchronized方法的线程退出此方法后,才能依次执行。 但是,非synchronized方法不受影响,不管当前有没有执行synchronized方法,非synchronized方法都可以被多个线程同时执行。 此外,必须注意,只有同一实例的synchronized方法同一时间只能被一个线程执行,不同实例的synchronized方法是可以并发的。例如,class A定义了synchronized方法sync(),则不同实例a1.sync()和a2.sync()可以同时由两个线程来执行。
发表于07-05-15 14:47 | 阅读 694 | 评分 (暂无)
Java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。 Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法: Thread t = new Thread(); t.start(); start()方法是一个native方法,它将启动一个新线程,并执行run()方法。Thread类默认的run()方法什么也不做就退出了。注意:直接调用run()方法并不会启动一个新线程,它和调用一个普通的java方法没有什么区别。 因此,有两个方法可以实现自己的线程: 方法1:自己的类extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如: public class MyThread extends Thread { public run() { ...
发表于07-05-15 14:45 | 阅读 1825 | 评分 (暂无)
第一步:下载JDK1.4   JDK是Java Developement Kit的缩写,包括Java编译器和运行时环境,1.4版本是目前最稳定的版本,我们强烈推荐您使用。可以从SUN Java站点下载JDK1.4。 第二步:安装JDK1.4   直接运行JDK1.4的安装程序,选择一个安装目录,按照安装向导即可轻松完成JDK1.4的安装。如需了解安装细节,请参考Java 2 SDK 1.4.2 Installation Notes for Microsoft Windows。 第三步:设置环境变量   设置环境变量是为了更方便的使用JDK开发,某些Java程序也依赖环境变量来定位JDK,因此我们强烈建议您设置如下环境变量:   JAVA_HOME=   CLASSPATH=.   Path=<原Path>;%JAVA_HOME%\bin   请注意:CLASSPATH变量的值是“.”(不包括引号),在Path变量最后添加“;%JAVA_HOME%\bin”(不包括引号)。   Java虚拟机的ClassLo ...
发表于07-05-15 14:42 | 阅读 724 | 2人对此综合评价
1.在源代码中快速跳转 eclipse中的跳转甚至比VS.Net还方便,方法是按住Ctrl键,然后鼠标指向变量名,方法名,类名,就会出现链接,点击就可跳到定义处。 2.实时语法检查 编辑区右侧如果有红色小方块,直接点击就可跳到有错的行;黄色小方块是警告,可以忽略,但最好检查一下;如果某个函数尚未完成,要提醒自己注意怎么办?加上注释// TODO,右侧就会有蓝色小方块,提示你此处尚未完成。当一个源码的右侧没有任何提示时,说明这个文件已经完成了。 3.自动生成getter/setter方法 只需要申明protected,private类成员变量,然后在Package Explore中找到该类,右键点击,选择“Source”“Generate Getters and Setters”。 4.更改类名/变量名 如果涉及到多处修改,不要直接在源码中更改,在Package Explore中找到要改名的类或变量,右键点击,选择“Refactor”“Rename”,eclipse会自动搜索所有相关 ...
发表于07-05-12 14:35 | 阅读 745 | 1人对此综合评价
  线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口   Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。   所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参
发表于07-05-12 14:33 | 阅读 903 | 1人对此综合评价
文件上传在web应用中非常普遍,要在servlet/jsp环境中实现文件上传功能非常容易,因为网上已经有许多用java开发的组件用于文件上传,本文以commons-fileupload组件为例,为servlet/jsp应用添加文件上传功能。 common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。该组件简单易用,可实现一次上传一个或多个文件,并可限制文件大小。 下载后解压zip包,将commons-fileupload-1.0.jar复制到tomcat的webapps\你的webapp\WEB-INF\lib\下,如果目录不存在请自建目录。 新建一个servlet: Upload.java用于文件上传: import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.commons.fileupload.*; pu
发表于06-08-23 04:51 | 阅读 601 | 评分 (暂无)

Google Talk Java手机客户端能运行在Java手机上实现与Google Talk好友聊天,无须中间服务器,客户端将直接通过Jabber协议连接Google Talk服务器。目前仅在SUN WTK 2.5上测试通过,运行环境为CLDC 1.1 / MIDP 2.0,自适应屏幕大小:
http://code.google.com/p/gtmobile/downloads/list

发表于06-06-19 17:29 | 阅读 494 | 评分 (暂无)

许多MIDP应用程序需要简单的存储配置信息,对此,简单封装一个RMSHandler,实现一条记录的读写:package com.crackj2ee.midp.rms;import java.io.*;import javax.microedition.rms.*;public final class RMSHandler {    private static final String RECORD_STORE_NAME = "RmsDaTa";    public static boolean loadUniqueRecord(Persistentable p) {
        byte[]&nb ...
发表于05-11-06 05:29 | 阅读 401 | 评分 (暂无)

编写灵活的RMS应用
MIDP应用程序的标准持久化方案就是使用RMS。RMS类似于一个小型数据库,RecordStore相当于数据库的表,每个&ldquo;表&rdquo;由若干记录(Record)构成,一条记录就是一个用int表示的记录号RecordID和用byte[]表示的内容。记录号可以看作是&ldquo;主键&rdquo;,byte[]数组存储内容。
RMS提供的记录操作可以实现根据ID直接获得记录,或者枚举出一个表中的所有记录。
枚举记录是非常低效的,因为只能比较byte[]数据来确定该记录是否是所需的记录。通过ID获得记录是高效而方便的,类似于SQL语句&ldquo;SELECT byteArrayData FROM recordStoreName WHERE RecordID=?&rdquo;。然而,通常应用程序很难知道某条记录的ID号,而RMS记录的&ldquo;主键&rdquo;又仅限于int类型,无法使用其他 ...
发表于05-11-06 05:17 | 阅读 405 | 评分 (暂无)

编写反应灵敏的联网提示界面
由于无线设备所能支持的网络协议非常有限,仅限于HTTP,Socket,UDP等几种协议,不同的厂家可能还支持其他网络协议,但是,MIDP 1.0规范规定,HTTP协议是必须实现的协议,而其他协议的实现都是可选的。因此,为了能在不同类型的手机上移植,我们尽量采用HTTP作为网络连接的首选协议,这样还能重用服务器端的代码。但是,由于HTTP是一个基于文本的效率较低的协议,因此,必须仔细考虑手机和服务器端的通信内容,尽可能地提高效率。
对于MIDP应用程序,应当尽量做到:
1.发送请求时,附加一个User-Agent头,传入MIDP和自身版本号,以便服务器能识别此请求来自MIDP应用程序,并且根据版本号发送相应的相应。
2.连接服务器时,显示一个下载进度条使用户能看到下载进度,并能随时中断连接。
3.由于无线网络连接速度还很慢,因此有必要将某些数据缓存起来,可以存储在内存中,也可以放到RMS中。
对于服务器端而言,其输出响应应当尽量做到:
1. 明确设置Content ...
发表于05-11-04 00:04 | 阅读 393 | 评分 (暂无)

屏幕导航
除了游戏程序,在通常的MIDP应用程序中,通常会有很多个Screen或Canvas,这些屏幕一般靠命令来实现切换,比如用户点击&ldquo;Next&rdquo;应该跳到下一屏,点击&ldquo;Back&rdquo;应该返回到上一屏。当屏幕数量相当可观时,如何在各个屏幕之间导航就值得好好考虑了。
经典的MVC模式可用于屏幕导航,Model用于存储应用程序数据,而View则是各个Displayable对象,Controller需要单独的一个类实现。由于MIDlet类本身在生命周期内就只有一个实例,因此MIDlet类就非常适合作为Controller。SUN在blueprints示例程序SmartTicket中应用了非常复杂的MVC,完全可以满足MIDP应用程序的导航需要,但是可以看出,缺点是很明显的:
一是每一个事件都需要一个唯一标识,switch-case语句会随着屏幕的增加而增加,Controller变得难以维护。二是Controller引用了所有的View,这些View在程序启动时就被初始化导 ...
发表于05-11-03 01:24 | 阅读 424 | 评分 (暂无)

获取设备支持的可选API
J2ME规范包括了许多可选包,如支持多媒体功能的MMAPI,支持消息接收和发送的WMA,支持3D游戏的M3G API。如果某一款手机支持某个可选API,MIDP应用程序就可以使用它。但是,让用户回答&ldquo;本机是否支持MMAPI&rdquo;是不友好的,发布几个不同版本不但增加了开发的工作量,也让用户难以选择。因此,应用程序应该自己检测手机是否支持某一API,从而在运行期决定是否可以使用此API。
MIDP 1.0和2.0应用程序都可以通过System.getProperty(String key)检测某一个属性的信息。如果该属性有效,将返回对应的字符串,否则,返回null,表示系统不支持此功能。
例如,System.getProperty("microedition.profiles")可能的返回值是"MIDP-1.0"或"MIDP-2.0"。
以下是常见的系统属性和可选API的属性,右侧列出了 ...
发表于05-11-03 01:20 | 阅读 368 | 评分 (暂无)

概述
J2ME是Sun发布的运行在小型设备上的微型版Java的一系列标准,其中,最重要的标准便是运行在手机上的MIDP应用程序了。到目前为止,MIDP一共发布了两个版本:MIDP 1.0(JSR37)和MIDP 2.0(JSR118),2.0版本可以向后兼容1.0版本,也就是说,支持MIDP 2.0的手机可以同时运行MIDP 1.0和MIDP 2.0的应用程序。本文将重点讲述开发MIDP应用程序时非常有用的一些设计模式,开发技巧以及如何调试、优化J2ME应用程序。
本文将讨论J2ME开发的以下内容:
* 如何自动适应用户手机配置

* 如何在屏幕间导航

* 如何实现一个灵活的联网应用

* 如何实现一个灵活的RMS应用

* 如何调试并优化J2ME程序

避免OutOfMemoryError
对于MIDP应用程序来说,由于手机设备上的资源非常有限,较弱的 ...
发表于05-10-20 17:13 | 阅读 402 | 评分 (暂无)

由于MIDP没有J2SE对应的java.net.URLEncoder类,因此,要向服务器发送HTTP请求,必须自己进行URL编码,参考JDK1.4.2的src代码,将其改为一个能用在MIDP环境中的URLEncoder类:
// URLEncoder.java
package com.mboker.blog.midp.http;
import java.io.*;
/**
 * Encode url, just like java.net.URLEncoder.encode() in J2SE.<br>
 * NOTE: This class is modified from java.net.URLEncoder class in J2SE 1.4.
 *&n ...
发表于05-08-08 21:03 | 阅读 450 | 评分 (暂无)

在J2ME开发中,由于手机设备的资源限制,要编写既可移植,又能高效运行的J2ME程序,同时还要保持一个灵活的架构以便将来扩展是不容易的。
本文将讨论普通的MIDP 1.0/2.0应用程序的若干最佳实践,包括:
1. 如何自适应用户手机的配置
2. 如何在屏幕间导航
3. 如何实现灵活高效的HTTP应用
4. 如何灵活操作RMS
5. 一些调试和优化的技巧
如果您对J2ME开发感兴趣,请继续关注此主题,欢迎来信交流:asklxf@163.com。

发表于05-03-23 16:49 | 阅读 292 | 评分 (暂无)

实现View

在MIDP中,View就是Screen或者Canvas,在这个游戏中,我们应该使用Canvas,定义:

    public class MainCanvas extends Canvas implements CommandListener, Updatable { ... }

在构造方法中,初始化Document:

    public MainCanvas(String imageName) {
        // 读图像:
        Image[] images&n ...
发表于05-03-22 20:29 | 阅读 295 | 评分 (暂无)

设计Document类

Document类需要保存游戏运行中所有的状态数据,对于这个拼图游戏来说,我们设计以下成员变量:

    Updatable updatable;
    int state;
    Image[] images = new Image[9];
    int[][] current = new int[3][3];
    int hiddenX, hiddenY;
    int steps; // 移动的步数

MainCanvas需要实现Updatable接 ...
发表于05-03-17 00:58 | 阅读 292 | 评分 (暂无)

MIDP规范的出现使得我们在手机上开发Java游戏成为可能。今天我们要实现的是一个简单的拼图游戏。这个拼图游戏是一个3x3的拼图,由9个分割的小图片构成。这样,在手机上,可以用按键1-9对应每个图片。需要移动某个图片时,只需按下对应的数字键即可,非常方便。(当然,对于键盘不规则的手机,就只能委屈了)当按下0键时,显示整个原始图片。

虽然MIDP提供了许多高级和低级的UI API接口,但是整个应用程序的结构设计仍然至关重要,一个灵活的框架能大大降低游戏开发的复杂度。

MVC模式几乎是UI应用开发的标准模式了,通过Model-View-Controller的分工合作,使得整个应用程序的不同功能部分被分离开来,从而降低开发难度。

MVC有MVC1和MVC2两种模式,其不同之处在于Model能否主动通知View。在窗口程序中,Model可以主动通知View是否需要Update,因此应使用MVC1;在Web程序中,由于http协议的限制,服务器端的Model无法主动调用View(如JSP页面),因此只能使用MV ...
发表于05-03-07 17:07 | 阅读 233 | 评分 (暂无)

    3D技术对我们来说已经非常熟悉了,最常用的3D API有OpenGL和Microsoft的Direct 3D,在桌面游戏中早已广泛应用。对于J2ME程序而言,Mobile 3D Graphics API(JSR184)的出现,使得为手机应用程序添加3D功能成为可能。

    JSR184标准(M3G:Mobile 3D Graphics)为Java移动应用程序定义了一个简洁的3D API接口,J2ME程序可以非常方便地使用M3G来实现3D应用比如游戏等等。M3G被设计为非常轻量级的,整个API的完整实现不超过150kb。

    M3G是J2ME的一个可选包,以OpenGL为基础的精简版,一共有30个类,运行在CLDC1.1/CLDC2.0上(必须支持浮点运算),可以在MIDP1.0和MIDP2.0中使用。目前,支持M3G的 ...
129项,7页: 上一页 1 2 3 4 5 6 7 下一页
自我介绍 »
潜心研究JavaEE……
等级:
搜索文章 »
文章分类 »
最新发表 »
最新评论 »