|
博客首页 » 最新文章
发表于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相当于数据库的表,每个“表”由若干记录(Record)构成,一条记录就是一个用int表示的记录号RecordID和用byte[]表示的内容。记录号可以看作是“主键”,byte[]数组存储内容。 RMS提供的记录操作可以实现根据ID直接获得记录,或者枚举出一个表中的所有记录。 枚举记录是非常低效的,因为只能比较byte[]数据来确定该记录是否是所需的记录。通过ID获得记录是高效而方便的,类似于SQL语句“SELECT byteArrayData FROM recordStoreName WHERE RecordID=?”。然而,通常应用程序很难知道某条记录的ID号,而RMS记录的“主键”又仅限于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,这些屏幕一般靠命令来实现切换,比如用户点击“Next”应该跳到下一屏,点击“Back”应该返回到上一屏。当屏幕数量相当可观时,如何在各个屏幕之间导航就值得好好考虑了。 经典的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应用程序就可以使用它。但是,让用户回答“本机是否支持MMAPI”是不友好的,发布几个不同版本不但增加了开发的工作量,也让用户难以选择。因此,应用程序应该自己检测手机是否支持某一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的 ...
|