2010-04-11 112 views
2

我的任务是模拟几个人的活动。他们中的每一个人在一些随机时间内执行的活动很少:快速(0-5s),中等(5-10s),慢(10-20s)和非常慢(20-30s)。每个人在同一时间独立执行任务。在新任务开始时,我应该打印它的随机时间,启动任务,然后在时间过后显示下一个任务的时间并启动它。我写了run()函数来计算时间,但现在看起来线程是一个接一个地完成的,而不是在同一时间完成的,或者他们只是以这种方式打印。在Java中运行多线程

public class People{ 
    public static void main(String[] args){ 
    Task tasksA[]={new Task("washing","fast"), 
       new Task("reading","slow"), 
       new Task("shopping","medium")}; 
    Task tasksM[]={new Task("sleeping zzzzzzzzzz","very slow"), 
       new Task("learning","slow"), 
       new Task(" :** ","slow"), 
       new Task("passing an exam","slow") }; 
    Task tasksJ[]={new Task("listening music","medium"), 
       new Task("doing nothing","slow"), 
       new Task("walking","medium") }; 

    BusyPerson friends[]={ new BusyPerson("Alice",tasksA), 
          new BusyPerson("Mark",tasksM), 
          new BusyPerson("John",tasksJ)}; 

    System.out.println("STARTING....................."); 
    for(BusyPerson f: friends) 
     (new Thread(f)).start(); 
    System.out.println("DONE........................."); 
    } 
} 

class Task { 

    private String task; 
    private int time; 
    private Task[]tasks; 

    public Task(String t, String s){ 
     task = t;  
     Speed speed = new Speed(); 
     time = speed.getSpeed(s); 
    } 

    public Task(Task[]tab){ 
     Task[]table=new Task[tab.length]; 
     for(int i=0; i < tab.length; i++){ 
      table[i] = tab[i]; 
     } 
     this.tasks = table; 
    } 
} 

class Speed { 

    private static String[]hows = {"fast","medium","slow","very slow"}; 
    private static int[]maxs = {5000, 10000, 20000, 30000}; 

    public Speed(){ 
    } 

    public static int getSpeed(String speedString){ 
     String s = speedString; 
     int up_limit=0; 
     int down_limit=0; 
     int time=0; 
//get limits of time 
     for(int i=0; i<hows.length; i++){ 
      if(s.equals(hows[i])){ 
       up_limit = maxs[i]; 
       if(i>0){ 
        down_limit = maxs[i-1]; 
       } 
       else{ 
        down_limit = 0; 
       } 
      } 
     } 
//get random time within the limits 
     Random rand = new Random(); 
     time = rand.nextInt(up_limit) + down_limit; 

    return time; 
    } 

} 

class BusyPerson implements Runnable { 
    private String name; 
    private Task[] person_tasks; 
    private BusyPerson[]persons; 

    public BusyPerson(String s, Task[]t){ 
     name = s; 
     person_tasks = t; 
    } 

    public BusyPerson(BusyPerson[]tab){ 
     BusyPerson[]table=new BusyPerson[tab.length]; 
     for(int i=0; i < tab.length; i++){ 
      table[i] = tab[i]; 
     } 
     this.persons = table; 
    } 

public void run() { 
    int time = 0; 
    double t1=0; 

    for(Task t: person_tasks){ 
     t1 = (double)t.time/1000; 
     System.out.println(name+" is... "+t.task+" "+t.speed+ 
       " ("+t1+" sec)"); 
     while (time == t.time) { 
      try { 
       Thread.sleep(10); 
      } catch(InterruptedException exc) { 
       System.out.println("End of thread."); 
       return; 
      } 
      time = time + 100; 
     } 
    } 

} 
} 

而且我的输出:

STARTING..................... 
DONE......................... 
Mark is... sleeping zzzzzzzzzz   very slow   (36.715 sec) 
Mark is... learning   slow   (10.117 sec) 
Mark is...  :**    slow   (29.543 sec) 
Mark is... passing an exam   slow   (23.429 sec) 
Alice is... washing   fast   (1.209 sec) 
Alice is... reading   slow   (23.21 sec) 
Alice is... shopping   medium   (11.237 sec) 
John is... listening music   medium   (8.263 sec) 
John is... doing nothing   slow   (13.576 sec) 
John is... walking   medium   (11.322 sec) 

虽然它应该是这样的:

STARTING..................... 
    DONE......................... 
    John is... listening music  medium  (7.05 sec) 
    Alice is... washing  fast (3.268 sec) 
    Mark is... sleeping zzzzzzzzzz  very slow (23.71 sec) 
    Alice is... reading  slow (15.516 sec) 
    John is... doing nothing slow (13.692 sec) 
    Alice is... shopping medium  (8.371 sec) 
    Mark is... learning slow (13.904 sec) 
    John is... walking  medium  (5.172 sec) 
    Mark is... :**   slow (12.322 sec) 
    Mark is... passing an exam  very slow (27.1 sec) 
+1

@owca:+1 ...很好的书面和有点酷的问题。我不明白为什么人们会认为一些答案值得上调,但不要投票回答。 – SyntaxT3rr0r 2010-04-11 16:09:33

回答

3

好像你等待循环有错误的终止条件,使用time == t.time代替time <= t.time。此外,它似乎在每次迭代中增加100而不是10。

此外,您应该在每个循环前重置time

换句话说,循环

while (time == t.time) { 
    try { 
     Thread.sleep(10); 
    } catch(InterruptedException exc) { 
     System.out.println("End of thread."); 
     return; 
    } 
    time = time + 100; 
} 

也许应该

time = 0; 
while (time <= t.time) { 
    try { 
     Thread.sleep(10); 
    } catch(InterruptedException exc) { 
     System.out.println("End of thread."); 
     return; 
    } 
    time += 10; 
} 

,或者使用一个for循环,而不是:

for (int time = 0; time <= t.time; time += 10) { 
    try { 
     Thread.sleep(10); 
    } catch(InterruptedException exc) { 
     System.out.println("End of thread."); 
     return; 
    } 
} 

然而,真的没有任何理由以10毫秒的增量进行睡眠。另外,Thread.sleep()可能不精确。最好一次尝试整个过程,然后检查时钟。

long timeToWakeup = System.currentTimeMillis() + t.time; 
long sleepMs = t.time; 
while (sleepMs > 0) { 
    try { 
     Thread.sleep(sleepMs); 
    } catch(InterruptedException exc) { 
     System.out.println("End of thread."); 
     return; 
    } 
    sleepMs = timeToWakeup - System.currentTimeMillis()); 
} 
+0

谢谢,现在它完美的工作。 – owca 2010-04-11 14:28:27