我们知道在操作系统级别上软件的运行一般都是以进程为单位而在每个进程的运行过程中允许同时并发执行多个不同线程这就使得一个程序能同时执行不同的操作使用多线程的目的是为了最大限度地利用计算机CPU资源JAVA程序字节码最终是在JVM虚拟机下运行的同一虚拟机进程中的不同操作都是通过多线程来运行的在JAVA虚拟机中线程常用有单线程和多线程单线程指程序执行过程只是一个有效操作的序列不同操作都有着明确的先后顺序而多线程允许同时进行着不同的操作这些不同的操作同时并发进行着并由CPU时钟频率根据不同的调度方式对他们进行执行调度 在JAVA语言中提供了丰富的多线程操纵接口提供了各类不同的线程实现方法供我们选择功能非常强大在手机软件设计中由于同样需要执行网络连接(基于HTTP的高级Internet协议通讯)UI调度等待UI显示幻化游戏控制等操作需要通过后台的数据运算或UI不断更新等操作因此在JME中KVM虚拟机也提供了功能强大的多线程API使我们同样能在JME中实现线程的并发运算 在JME中主要有以下三种方法实现多线程 一继承Thread类(javalangThread) 通过编写线程类继承Thread类并重写Thread类中的run()方法实现线程当线程对象被运行时候将会自动执行run方法中的实体内容从而开辟一个单独的线程并运行起来 如public class ThreadSimple extends Thread{ public ThreadSimple() { //constructor } public void run() { //run codeentity } } 线程实例使用直接创建对象并调用start()方法即可运行线程 new ThreadSimple()start()当执行start方法时候将会自动运行run方法但是执行start方法时候只做了一件事就是将线程转化为可执行状态然后等待操作系统进行调度并运行因此无法保证线程能立即启动在JAVA中Thread类实现了Runnable接口因此run方法是通过实现接口Runnable中的抽象方法 二直接实现Runnable多线程接口(javalangRunnable) 线程接口Runnable中只有一个抽象方法run通过实现Runnable接口中的方法的类即可创建出有多线程特征的对象但该对象并无法使其启动线程需要作为参数并借助Thread的构造方法构造创建对象并调用start方法对线程进行启动 如public class RunnablSimple implements Runnable{ publicRunnableSimple() { //constructor } public void run(){ //run codeentity } } 实现类型的对象使用 RunnableSimple rs = new RunnableSimple() new Thread(rs)start() 由此可见以上两种方法都是通过Thread的start来启动线程的实际上所有的线程操作都是封装在Thread这个类中由Thread对象调用各种接口来控制线程 JME中线程中主要方法void setPriority(int newPriority)设置线程优先级在操作系统中线程的调度是不确定性的可以通过该方法设置相应线程的优先级别 static void sleep(long millis) 线程中静态方法用于让线程进入休眠状态执行该方法将会让线程在指定时间millis毫秒内休眠 void start()使现在进入可执行状态 void run() 线程执行主体 void join()等待该线程终止 boolean isAlive()用于判断线程是否出于Alive状态 static void yield() 尽量让其他线程先执行 三使用任务组合实现多线程 在JME中同样具有JAVA中的任务处理组合类他们分别为Timer和TimerTask可以使用他们实现多线程简单说就是定时实现任务 Timer是JAVA中的一个定时器可以实现在某一时间做某件事或者在某一时间段做某些事分别通过方法schedule(TimerTask ttlong millis)和schedule(TimerTask ttlong startlong off) TimerTask是一个任务类通过继承该类并覆盖方法run即可创建一个任务 如public class TimerTaskS extends TimerTask{ public TimerTaskS(){ //constructor } public void run(){ //run codeentity } } 任务调用 Timer timer = new Timer() //秒钟后执行任务 timerschedule(new TimerTaskS()) //秒钟后执行任务并且之后每秒钟执行一次 timerschedule(new TimerTaskS()) 有此可见在使用计时任务可以达到实现线程的效果分别执行不同的并发操作通过Timer类对象来操作TimerTask对象通过schedule方法来计时执行任务在结束任务的时候通常使用cancel()来实现 通常情况下在JME软件中我们通过手机按键来触发一系列相应的操作在程序响应处理过程中较多会涉及网络操作数据存储等相对消耗时间和资源的操作而这些操作往往需要一定的时间才能完成因此在处理按键响应过程中通常我们需要建立线程处理避免程序出现死机现象 public void commandAction(Command c Displayable s) { if(c==doCom){ //创建实现接口线程 new Thread(new RunnableSimple())start() } else if(c==doCom){ //创建继承Thread线程 new ThreadSimple()start(); } else{ //创建任务线程 new Timer()schedule(new TimerTaskS()); } } |