游戏进不去也算英雄联盟低优先级队列列

优先级队列(PriorityBlockingQueue)的性能测试
关于PriorityBlockingQueue的介绍,可以参见我的另外一篇博文:
下面对PriorityBlockingQueue的排序性能性能测试。
先创建即将存放在PriorityBlockingQueue中的java对象,该对象必须实现Comparable接口。
import java.util.D
public class JOBVO implements Comparable{
&private String jobID;
&private Date lastD
&public JOBVO(String jobID, Date lastDate) {
&&super();
&&this.jobID = jobID;
&&this.lastDate = lastD
&public String getJobID() {
&&return jobID;
&public void setJobID(String jobID) {
&&this.jobID = jobID;
&public Date getLastDate() {
&&return lastD
&public void setLastDate(Date lastDate) {
&&this.lastDate = lastD
&@Override
&public String toString() {
&&return "JOBBean [jobID=" +
jobID + ", lastDate=" + lastDate + "]";
&@Override
&public int compareTo(JOBVO o) {
&&Date date = new Date();
&&long thisRemainTime =
this.lastDate.getTime() - date.getTime();
&&long oRemainTime =
o.getLastDate().getTime() - date.getTime();
&&if(thisRemainTime&oRemainTime)
&&else if(thisRemainTime
&&else return 0;
2. 创建一个封装了PriorityQueueManager的队列管理器,支持压入任务和获取任务。
import java.util.concurrent.PriorityBlockingQ
public class PriorityQueueManager {
&private static PriorityBlockingQueue queue =
new PriorityBlockingQueue();
&public static void add(JOBVO job){
&&queue.add(job);
&public static JOBVO get(){
&&return queue.poll();
&public static int size(){
&&return queue.size();
3. 为了查阅消耗的时间查询,我将消耗的时间打印到日志文件中,所以先创建一个写文件的工具类:
import java.io.F
import java.io.FileNotFoundE
import java.io.PrintW
public class FileUtil {
&private String fileN
&private PrintW
&public FileUtil(String fileName){
&&this.fileName = fileN
&public void init(){
&&&pw = new
PrintWriter(new File(this.fileName));
&&} catch (FileNotFoundException
&&&e.printStackTrace();
&public void destory(){
&&if(pw!=null){
&&&pw.close();
&public void write(String context){
&&pw.write(context+"\n");
现在我们来写一个模拟压入队列任务(压入过程中,PriorityBlockingQueue会实时排序)的测试类,模拟20个线程,每个线程不间断的压入20000笔任务,即总共压入40万笔的任务。将消耗的时间存到日志中,使用CountDownLatch阀门来统计20个线程执行完40万的总消耗时间和平均消耗时间。
import java.util.D
edu.emory.mathcs.backport.java.util.concurrent.CountDownL
public class PutJOBTest {
&&& public
static void put(FileUtil timeFile,FileUtil jobFile) throws
InterruptedException{
&&CountDownLatch cdl = new
CountDownLatch(20);
&&long beginTime =
System.currentTimeMillis();
i=0;i&20;i++){
Thread(new PutThread(cdl,timeFile,jobFile)).start();
&&cdl.await();
&&System.out.println("ALL PUT JOB
Use time:"+(System.currentTimeMillis()-beginTime));
&&System.out.println("ALL PUT JOB
AVG time:"+(System.currentTimeMillis()-beginTime)/400000);
&&& static class
PutThread implements Runnable{
&&private CountDownLatch
&&private FileUtil
&&private FileUtil jobF
&&public PutThread(CountDownLatch
cdl,FileUtil timeFile,FileUtil jobFile){
&&&this.cdl =
&&&this.timeFile
&&&this.jobFile
&&@Override
&&public void run() {
&&&for(int
i=0;i&20000;i++){
date = DateUtil.getRandomDate();
beginTime = System.currentTimeMillis();
job = new JOBVO("1", date);
&&&&PriorityQueueManager.add(job);
&&&&timeFile.write(""+(System.currentTimeMillis()-beginTime));
&&&&//jobFile.write("Put
JOB: " + job);
&&&cdl.countDown();
现在我们再写一个模拟获取队列任务(队列顶任务被获取后,PriorityBlockingQueue会对剩下的任务进行实时排序)的测试类,模拟100个线程(人员),每个线程人员)不间断的获取4000笔任务,即总共获取40万笔的任务。将消耗的时间存到日志中,使用CountDownLatch阀门来统计20个线程执行完40万任务的总消耗时间和平均消耗时间。
edu.emory.mathcs.backport.java.util.concurrent.CountDownL
public class GetJOBTest {
&public static void get(FileUtil
timeFile,FileUtil jobFile) throws InterruptedException{
&&CountDownLatch cdl = new
CountDownLatch(50);
&&long beginTime =
System.currentTimeMillis();
i=0;i&100;i++){
Thread(new GetThread(cdl,timeFile,jobFile)).start();
&&cdl.await();
&&System.out.println("ALL GET JOB
Use time:"+(System.currentTimeMillis()-beginTime));
&&System.out.println("ALL GET JOB
AVG time:"+(System.currentTimeMillis()-beginTime)/400000);
&static class GetThread implements Runnable{
&&private CountDownLatch
&&private FileUtil
&&private FileUtil jobF
&&public GetThread(CountDownLatch
cdl,FileUtil timeFile,FileUtil jobFile){
&&&this.cdl =
&&&this.timeFile
&&&this.jobFile
&&@Override
&&public void run() {
&&&for(int
i=0;i&4000;i++){
beginTime = System.currentTimeMillis();
job = PriorityQueueManager.get();
&&&&timeFile.write(""+(System.currentTimeMillis()-beginTime));
&&&&//jobFile.write("Get
JOB: " + job);
&&&cdl.countDown();
6. 最后我们编写一个总的测试类:
import java.text.ParseE
public class Test {
&public static void main(String[] args) throws
ParseException, InterruptedException {
&&FileUtil timeFile = new
FileUtil("C:\\zjh\\time.txt");
&&FileUtil jobFile = new
FileUtil("C:\\zjh\\job.txt");
&&timeFile.init();
&&jobFile.init();
&&PutJOBTest.put(timeFile,jobFile);
&&GetJOBTest.get(timeFile,jobFile);
&&timeFile.destory();
&&jobFile.destory();
执行结果如下(单位:毫秒(ms)):
ALL PUT JOB Use time:3229
ALL PUT JOB AVG time:0
ALL GET JOB Use time:3121
ALL GET JOB AVG time:0
40万笔任务的压入和获取消耗的时间都在3秒左右,平均每笔的消耗基本可以不考虑。
可以查看时效消耗的日志文件,每笔的消耗时长基本都是0ms.
与普通不排序的队列(LinkedBlockingQueue)相比,可以做以下测试。
普通队列管理类:
edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQ
public class CommonQueueManager {
&private static LinkedBlockingQueue queue = new
LinkedBlockingQueue();
&public static void add(JOBVO job){
&&queue.add(job);
&public static JOBVO get(){
&&return (JOBVO)
queue.poll();
&public static int size(){
&&return queue.size();
将上面的PutJOBTest和GetJOBTest的队列管理类替换下,再执行Test测试类
测试结果如下:
ALL PUT JOB Use time:2652
ALL PUT JOB AVG time:0
ALL GET JOB Use time:220
ALL GET JOB AVG time:0
从测试结果可以看出:支持排序的队列PriorityBlockingQueue性能不比LinkedBlockingQueue差多少。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。(ERROR:15) & 访客不能直接访问匹配游戏的时候跳出错误“你已经在队列中 无法进行游戏匹配队列”
帖数:66,219
Windows XP: C:\Documents and Settings\All Users\Application Data\Battle.netWindows Vista/7: C:\ProgramData\Battle.net删除以上文件,文件是隐藏的
llllllllllll
win8呢?????
我找了 找不到啊
!@团队,你们技术不给力啊,玩家的问题没有解决
现在很多玩家都是这个问题。是服务器的问题。跟我们自己无关。服务器一直以为我们在一个队列中。所以我们做什么都没有用。
我也是这问题,难道只能等吗
我也存在这样的情况 已经2天了 win8系统 请问如何解决
帖数:15,537
请您提供下战网和联系电话,这边帮您记录下~
暴力威胁。我们将严肃对待此类行为,并会上报有关部门。
发布的主题中包含其他玩家的个人信息。包括实际地址、邮箱地址、电话号码及不当的照片和/或视频。
骚扰或歧视性用语。此类言辞将不允许出现。
现实生活中的威胁
失效的链接
阐述理由(最多256字)数据结构关于打印机队列问题打印机的打印队列中,每一个打印任务都有一个优先级,为1~9的一个整数(9的优先级最高,1的优先级最低),打印按如下方法进行.(1)取出打印队列中队首的打印任务J;(2)如果打印队列中存在优先级高于J的打印任务,则将J移动到打印队列的队尾;否则,打印J.现在的问题是,要确定你要打印的文件何时打印完毕。给定当前打印队列(一个优先级队列)和你的打印任务在当前打印队列中的位置,确定你的打印任务完成时需要多长时间。为了简化问题,假定没有新的打印任务加入到打印队列中;并且,假定完成任何一个打印任务均需要1min时间,向打印队列中加入一个打印任务或从打印队列中移除一个打印任务不需要时间。例如,当前打印队列为“1 1 9 1 1 1”且你的打印任务在队首时,需要5min.
桐儿9LS鯪1
这不是优先队列poj上的原题……本来题解就有很多吧http://vjudge.net/contest/viewSource.action?id=2310365
为您推荐:
扫描下载二维码

我要回帖

更多关于 lol低优先级队列 的文章

 

随机推荐