java 多线程 赛马游戏设计

Python032

java 多线程 赛马游戏设计,第1张

import java.util.Random

public class Test {

public static void main(String[] args) {

Competition c = new Competition()

Thread T = new Thread(c)

T.start()

}

}

class Competition implements Runnable{

int red = 0

int green = 0

int Speed [] = new int [2]

Competition(){

}

public void run(){

Random r = new Random()

for(int a= 0a<500a++){

for(int j = 0j<2j++){

Speed[j] = r.nextInt(2)

red = red + Speed[j]

Speed[j] = r.nextInt(2)

green = green + Speed[j]

}

System.out.println("red的速度为"+red)

System.out.println("green的速度为"+green)

while(red >=500 || green>=500){

if(red >=500){

System.out.println("red先抵达终点线")

}

if(green >= 500){

System.out.println("green先抵达终点线")

}

if(green ==500 &&red ==500 ){

System.out.println("两个同时到达")

}

return

}

}

/* if(red >green){

System.out.println("Redwin"+red)

}

if(red<green){

System.out.println("Greenwin"+green)

}

if(red == green){

System.out.println("equal")*/

}

}//给你个思路自己用swing画出来,这个小程序是把速度设为2红绿两只马先超过500这一线的获胜.如果要多人比赛开启线程就好

package test

import java.util.ArrayList

import java.util.Arrays

import java.util.Collections

import java.util.Comparator

import java.util.HashMap

import java.util.List

import java.util.Map

import java.util.Set

import java.util.SortedMap

import java.util.TreeMap

import sun.util.logging.resources.logging

/**

* 2010-1-17 下午03:08:52 Piaolj

*/

public class Racing implements Runnable {

String str

static Map horses = new TreeMap()// 定义一个全局的Map存放5个马的名字和时间

static int count = 0// 用于判断县城是否全部结束

static boolean flag = true// 后面用while(flag)判断count是否为0,如果有兴趣,可以起另外一个线程完成此任务

public Racing(String string) {

// TODO Auto-generated constructor stub

this.str = string

}

public static void main(String[] args) {

Racing ra1 = new Racing("No.1 Horse")

Racing ra2 = new Racing("No.2 Horse")

Racing ra3 = new Racing("No.3 Horse")

Racing ra4 = new Racing("No.4 Horse")

Racing ra5 = new Racing("No.5 Horse")

Racing checkingThread = new Racing("checkingThread")

Thread t1 = new Thread(ra1)

Thread t2 = new Thread(ra2)

Thread t3 = new Thread(ra3)

Thread t4 = new Thread(ra4)

Thread t5 = new Thread(ra5)

t1.start()

t2.start()

t3.start()

t4.start()

t5.start()

while (flag) {

if (count == 0)// 所有线程结束

{

flag = false

}

}

// 排序

List infoIds = new ArrayList(horses.entrySet())

Collections.sort(infoIds, new Comparator<Map.Entry>() {

public int compare(Map.Entry o1, Map.Entry o2) {// 定义了比较的规则,因为这里是按map的value排序的

Long tmp = Long.parseLong(o1.getValue().toString())

- Long.parseLong(o2.getValue().toString())

return tmp.intValue()

}

})

System.out.println("输出马的名次:")

System.out.println()

for (int i = 0i <infoIds.size()i++) {

String id = infoIds.get(i).toString()

System.out.println(id)

}

}

public void run() {

// TODO Auto-generated method stub

int CircuitLength = 1000

int breakpoint = 200

int tmpint = 200

long Withtime

count = count + 1// 执行了一个线程,正在执行的线程数加1

// System.out.println(Thread.currentThread().getId())

for (int i = 0i <CircuitLength + 1i++) {

long start = System.currentTimeMillis()

if (i == breakpoint) {

int sleeping = (int) (Math.random() * 5000)

try {

Thread.sleep(sleeping)

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

breakpoint = breakpoint + tmpint

}

if (i == CircuitLength) {

System.out.print(str + "\t" + "\t")

long end = System.currentTimeMillis()

Withtime = (end - start)

System.out.println("With time is:\t" + Withtime)

// 当每匹马跑完将马的时间的马的名称放入map中

horses.put(str, Withtime)

}

}

count = count - 1// 执行完了一个线程,线程数减1

}

}

时间比较少,写的比较草,呵呵 加了点注释,要是有问题可以发短消息

输出结果:

No.4 Horse With time is: 888

No.3 Horse With time is: 3042

No.5 Horse With time is: 1921

No.2 Horse With time is: 4346

No.1 Horse With time is: 2831

输出马的名次:

No.4 Horse=888

No.5 Horse=1921

No.1 Horse=2831

No.3 Horse=3042

No.2 Horse=4346

cyclibarriar 就是栅栏,顾名思义:就是一个拦截的装置。多个线程start后,在栅栏处阻塞住,一般定义栅栏的时候会定义有多少个线程。比如定义为4个,那么有三个线程到栅栏处,就阻塞住,如果没有第四个,就会一直阻塞,知道启动第四个线程到栅栏处,所有的线程开始全部进行工作。有点像赛马的例子。所有的赛马一个一个到起点,然后到齐了,在开始跑。

countdownlatch:初始化定义一个数字(整型),比如定义2,一个线程启动后在await处停止下来阻塞,调用一次countDown,会减一,知道countDown后变为0时的时候,线程才会继续进行工作,否则会一直阻塞。

自己写个赛马的程序,其实就什么都懂了。