在Java中运行多线程

在Java中运行多线程,java,multithreading,Java,Multithreading,我的任务是模拟两个人的活动。他们中的每一个人在某个随机时间内几乎没有要执行的活动:快(0-5秒)、中(5-10秒)、慢(10-20秒)和非常慢(20-30秒)。每个人在同一时间独立完成任务。在新任务开始时,我应该打印它的随机时间,启动任务,然后在时间流逝后显示下一个任务的时间并启动它。我已经编写了计算时间的run()函数,但现在看起来线程是一个接一个地完成的,而不是在同一时间完成的,或者它们只是以这种方式打印出来的 public class People{ public static voi

我的任务是模拟两个人的活动。他们中的每一个人在某个随机时间内几乎没有要执行的活动:快(0-5秒)、中(5-10秒)、慢(10-20秒)和非常慢(20-30秒)。每个人在同一时间独立完成任务。在新任务开始时,我应该打印它的随机时间,启动任务,然后在时间流逝后显示下一个任务的时间并启动它。我已经编写了计算时间的run()函数,但现在看起来线程是一个接一个地完成的,而不是在同一时间完成的,或者它们只是以这种方式打印出来的

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.........................
   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)

似乎您的等待循环具有错误的终止条件,使用
time==t.time
而不是
time@owca:+1。。。写得很好,是个很酷的问题。我不明白为什么人们认为有些答案值得投票,但却不投票支持这个问题。
   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)
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 (int time = 0; time <= t.time; time += 10) {
    try {
        Thread.sleep(10);
    } catch(InterruptedException exc) {
        System.out.println("End of thread.");
        return;
    }
}
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());
}