当前位置:首页 > CN2资讯 > 正文内容

我的世界java版单核调度

3天前CN2资讯


0、序

    在游戏工程地开发过程中,定时器功能是一般游戏必不可少的功能,同时,在其他类型的项目中,也会时常需要用到定时器的方法。例如游戏中建造一个建筑需要倒计时等。下面从单线程和多线程两个方面实现定时器的功能。

1、单线程(schedule)

    首先我们需要一个单独的定时任务类,继承TimerTask,用来表示具体的定时任务,单独提出来封装成一个类,方便管理和实现:

import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; public class SystemTimerTask extends TimerTask{ private long taskID;//任务ID private long runtime;//倒计时的具体时间(以秒为单位) private ConcurrentHashMap<Long, Future<Long>> futureMap; public SystemTimerTask(Long taskID,long runtime) { this.taskID = taskID; this.runtime = runtime; } @Override public void run() { System.out.println("Time Remain: "+this.runtime); if (this.runtime-- <= 0 ) { try { Future<Long> future = futureMap.remove(taskID); future.cancel(true); } finally { System.out.println("###### Task "+taskID +" is Completed!!"); } } } public long getRemaintime() { return runtime; } public long getTaskID() { return taskID; } }

 

    在单线程的情况下,不需要考虑其他条件直接调用 schedule 方法即可实现,具体调用方法如下:

Timer timer = new Timer(); SystemTimerTask() task = new SystemTimerTask(10001,20); timer.schedule(task ,0,1000);

schedule(TimerTask task, long delay, long period)

    --task:被调度的定时任务;

    --delay:以毫秒为单位,表示任务延迟delay毫秒后执行;

    --period:以毫秒为单位,表示任务执行持续时间,也就是定时器初始值。

2、多线程(ScheduledExecutorService)

    在实际应用开发中,单线程应用的范围很窄,并发是项目开发中必不可少的需要考虑到的因素,在定时器实现中,采用多线程,可以更有效率地实现多个定时器并发操作,同时,可以在一个大的项目中,对定时任务线程实施更方便地管理和查看。所以,我们在Java内置定时任务线程池ScheduledExecutorService基础上,封装成一个定时任务线程管理类,如下:

import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; //根据具体包名,将SystemTimerTask包含进来 public class TimerManager { private static TimerManager instance; private TimerManager() { } public static TimerManager getInstance() { if(instance == null) { return new TimerManager(); } return instance; } private ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); //初始化ScheduledExecutorService线程池,具体长度视情况而定 private static ConcurrentHashMap<Long, SystemTimerTask> taskmap = new ConcurrentHashMap<Long, SystemTimerTask>();//采用以任务ID为key的哈希表存储所有实现的定时任务 public boolean StartTimer(long id,long time,long initialDelay, long period, TimeUnit unit ) { if(taskmap.containsKey(id) ) { return false; } else { SystemTimerTask task_time = new SystemTimerTask(id,time); this.addTask(id, task_time); Iterator keys = taskmap.keySet().iterator(); while(keys.hasNext()){ Long key = (Long)keys.next(); if(key == id) System.out.println("是否存在------------- "+ (key == id)+" id: "+id); } System.out.println("是否存在+++++++++++ "+ taskmap.get(id).getRemaintime()); this.service.scheduleAtFixedRate(task_time, initialDelay,period, unit); return true; } } public ScheduledExecutorService getService() { return service; } public void setService(ScheduledExecutorService service) { this.service = service; } public long getRemain(long id) { if(this.getTask().containsKey(id)) { return this.getTask().get(id).getRemaintime(); } else return -1; } public ConcurrentHashMap<Long, SystemTimerTask> getTask() { return taskmap; } public void addTask( long id ,SystemTimerTask task1) { taskmap.put(id, task1) ; }}

    以上将定时器管理类设置为单例模式,防止其他对象对自己实例化,确保所有对象访问的都是一个实例。

 

scheduleAtFixedRate 方法的参数说明同上面的 Timer类中的 schedule 方法。可自行查阅。

    以下为其测试主函数:

public static void main(String[] args) throws InterruptedException { long remain = 10; long remain2 = 20; System.out.println("Start:"); long id1 = 100; long id2 = 110; TimerManager.getInstance().StartTimer(id1, remain, 0, 1, TimeUnit.SECONDS); TimerManager.getInstance().StartTimer(id2, remain2, 0, 1, TimeUnit.SECONDS); Thread.sleep(3000); System.out.println("是否存在::::"+ TimerManager.getInstance().getTask().containsKey(id1)); System.out.println("+++++++++++++++++++++Time remain................ :"+TimerManager.getInstance().getRemain(id2)); }

3、总结

    在本文中,基于单线程和多线程两种方式实现定时器的功能,两种各有优缺点,合理采纳。同时,在多线程实现中,有一点不足之处,在具体应用的时候希望改正,就是定时任务ID可以采用自动生成的增长序列,保证其唯一性,因为时间关系,本文尚未添加。

 

 

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/21950.html

    分享给朋友:

    “我的世界java版单核调度” 的相关文章

    深入了解DC9飞机的历史、技术特点与运营经验

    DC9概述 了解DC9这款飞机,首先得从它的历史说起。DC9,或称道格拉斯DC-9,是由道格拉斯飞机公司设计制造的中短程单通道喷气式客机。这款飞机的诞生可以追溯到20世纪60年代。道格拉斯公司在这段时间逐步崛起,骄傲地推出了DC9作为回应当时日益增长的民航市场需求。最初的设计版本虽然体积不大,但凭借...

    Oracle 免费VPS:轻松入门云计算的最佳选择

    在了解Oracle免费VPS之前,先来看看Oracle Cloud。这是甲骨文公司推出的一项云服务,提供了一系列强大的计算和存储资源。Oracle Cloud的最吸引人的部分是它的免费服务,给用户提供了机会,可以在没有经济负担的情况下体验云计算的强大功能。对于开发者、创业者或只是想进行一些小项目的用...

    解决Linode被封的问题与账户恢复策略分享

    Linode作为一款备受欢迎的美国VPS,其灵活性和服务质量吸引了众多用户。然而,基于我的经验,国内用户在使用Linode时常常面临被封的困扰。这不仅影响了使用体验,也对业务的持续性造成了影响。我想深入分析一下Linode被封的原因。 首先,Linode的全球网络状况在近年来遭遇了严峻挑战。随着越来...

    OVH云服务概述:高性价比的VPS与专用服务器解决方案

    OVH概述 谈到云服务提供商,OVH无疑是一个引人注意的名字。这家成立于1999年的法国公司,总部位于鲁贝,已经从当初的小公司发展成为全球领先的云服务平台。OVH不仅为个人和企业提供各种云计算解决方案,还持续推动技术创新,满足越来越多用户的需求。 OVH拥有广泛的服务网络,分布在北美、欧洲、亚洲和非...

    AS4837和AS9929线路在国际通信中的优势与应用分析

    在了解AS4837线路的历史背景时,回顾其起源与发展非常重要。AS4837线路,通常被称为中国联通的骨干网线路,最早始建于20世纪90年代。那时,随着互联网的兴起,全球对网络基础设施的需求不断增加,中国决定建立更强大的国际连接,通过AS4837将中国大陆与香港、美国、日本、韩国等多地紧密相连。这个决...

    搬瓦工官网是哪个?全面解析搬瓦工的官方链接和服务

    搬瓦工官网是哪个? 当我提到“搬瓦工”,很多朋友可能会想知道它的官网到底在哪儿。其实,搬瓦工的主官网地址是 bandwagonhost.com。不过,有时访问这个主域名可能会遇到点小问题。为了方便用户,搬瓦工还提供了几个官方镜像站,包括 bwh1.net、bwh8.net、bwh81.net、bwh...