|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看NetBeans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。
这里供应两种在指准时间后启动线程的办法。一是经由过程java.util.concurrent.DelayQueue完成;二是经由过程java.util.concurrent.ScheduledThreadPoolExecutor完成。
1.java.util.concurrent.DelayQueue
类DelayQueue是一个无界堵塞行列,只要在提早期满时才干从中提取元素。它承受完成Delayed接口的实例作为元素。
<<interface>>Delayed.java
packagejava.util.concurrent;
importjava.util.*;
publicinterfaceDelayedextendsComparable<Delayed>{
longgetDelay(TimeUnitunit);
}
getDelay()前往与此对象相干的残剩提早工夫,以给定的工夫单元暗示。此接口的完成必需界说一个compareTo办法,该办法供应与此接口的getDelay办法分歧的排序。
DelayQueue行列的头部是提早期满后保留工夫最长的Delayed元素。当一个元素的getDelay(TimeUnit.NANOSECONDS)办法前往一个小于即是0的值时,将产生到期。
2.计划带偶然间提早特征的行列
类DelayedTasker保护一个DelayQueue<DelayedTask>queue,个中DelayedTask完成了Delayed接口,并由一个外部类界说。内部类和外部类都完成Runnable接口,关于内部类来讲,它的run办法是按界说的工夫前后掏出行列中的义务,而这些义务即外部类的实例,外部类的run办法界说每一个线程详细逻辑。
这个计划的本色是界说了一个具偶然间特征的线程义务列表,并且该列表能够是恣意长度的。每次增加义务时指定启动工夫便可。
DelayedTasker.java
packagecom.zj.timedtask;
importstaticjava.util.concurrent.TimeUnit.SECONDS;
importstaticjava.util.concurrent.TimeUnit.NANOSECONDS;
importjava.util.Collection;
importjava.util.Collections;
importjava.util.Random;
importjava.util.concurrent.DelayQueue;
importjava.util.concurrent.Delayed;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
importjava.util.concurrent.TimeUnit;
publicclassDelayedTaskerimplementsRunnable{
DelayQueue<DelayedTask>queue=newDelayQueue<DelayedTask>();
publicvoidaddTask(DelayedTaske){
queue.put(e);
}
publicvoidremoveTask(){
queue.poll();
}
publicCollection<DelayedTask>getAllTasks(){
returnCollections.unmodifiableCollection(queue);
}
publicintgetTaskQuantity(){
returnqueue.size();
}
publicvoidrun(){
while(!queue.isEmpty())
try{
queue.take().run();
}catch(InterruptedExceptione){
System.out.println("Interrupted");
}
System.out.println("FinishedDelayedTask");
}
publicstaticclassDelayedTaskimplementsDelayed,Runnable{
privatestaticintcounter=0;
privatefinalintid=counter++;
privatefinalintdelta;
privatefinallongtrigger;
publicDelayedTask(intdelayInSeconds){
delta=delayInSeconds;
trigger=System.nanoTime()+NANOSECONDS.convert(delta,SECONDS);
}
publiclonggetDelay(TimeUnitunit){
returnunit.convert(trigger-System.nanoTime(),NANOSECONDS);
}
publicintcompareTo(Delayedarg){
DelayedTaskthat=(DelayedTask)arg;
if(trigger<that.trigger)
return-1;
if(trigger>that.trigger)
return1;
return0;
}
publicvoidrun(){
//runallthatyouwanttodo
System.out.println(this);
}
publicStringtoString(){
return"["+delta+"s]"+"Task"+id;
}
}
publicstaticvoidmain(String[]args){
Randomrand=newRandom();
ExecutorServiceexec=Executors.newCachedThreadPool();
DelayedTaskertasker=newDelayedTasker();
for(inti=0;i<10;i++)
tasker.addTask(newDelayedTask(rand.nextInt(5)));
exec.execute(tasker);
exec.shutdown();
}
}
<p>
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。 |
|