2015-04-12 2 views
0

Я пытаюсь имитировать какие-то «серверы». У меня есть класс под названием Server, который расширяет Thread. У меня есть цикл от 1 до 1 000 000 и внутри, если он зависит от количества серверов, я хочу начать новый поток каждый раз, когда он идет вокруг цикла, чтобы сервер подбирал «запрос», выполняет его и отметьте сервер занятым, а затем остановите этот сервер отметки потоков как не занятый и дождитесь новых «запросов».Java: Как начать другой поток одного и того же объекта?

В настоящее время я получаю java.lang.IllegalThreadStateException и от того, что я прочитал, потому что я пытаюсь запустить тот же поток. Как я могу обойти это и реализовать то, что хочу?

Server.java

public class Server extends Thread 
{ 
    boolean isBusy = false; 
    int executionTime; 
    int serverId; 
    List<Request> requests = new ArrayList<Request>(); 
    Request currentRequest; 

    public Server(int requiredServerId,int requiredExecutionTime) 
    { 
     this.serverId = requiredServerId; 
     this.executionTime = requiredExecutionTime; 
    } 

    @Override 
    public void run() 
    { 
     isBusy = true; 
     for(int time = 1; time <= executionTime; time++) 
     { 
      if(time == executionTime) 
      { 
       isBusy = false; 
       currentRequest.setFinish(); 
       break; 
      } 
     } 
    } 

    public void fetch(Request request) 
    { 
     requests.add(request); 
     currentRequest = request; 
    } 
} 

Main.java

// Create Servers 
    List<Server> servers = new ArrayList<Server>(); 
    for(int i = 0; i < numberOfServers; i++) 
    { 
     servers.add(new Server(i, executionTime)); 
    } 

    // Create Queue 
    List<Integer> queue = new ArrayList<Integer>(); 

    for(int time = 1; time <= runningTime; time++) 
    { 
     if(time % arrivalTime == 0) 
     { 
      if(queue.size() <= queueSize) 
      { 
       queue.add(time); 
      } 
      else 
      { 
       rejectedRequests += 1; 
      } 
     } 

     if(!queue.isEmpty()) 
     { 
      for(Server server : servers) 
      { 
       if(server.isBusy == false) 
       { 
        Request request = new Request(queue.get(0)); 
        queue.remove(0); 
        server.fetch(request); 
        server.start(); 
       } 
       break; 
      } 
     } 
    } 

ответ

1

Это больше проблем с вашим подходом, но давайте начнем с того.

В вашей основной при создании новых серверов, запускать их, а также, и не запускать их в «цикле обработки».

for(int i = 0; i < numberOfServers; i++) 
{ 
    servers.add(new Server(i, executionTime)); 
} 
for (Server s : servers) s.start(); 

ОК, теперь ваши серверы, начинали и, вероятно, закончить их, прежде чем запустить главный сумеет дать им какую-то работу.

Так, в begginig бега они должны ждать чего-то, чтобы работать. Есть объекты object.wait() и object(). Notify(), которые вы могли бы использовать для этого, но вы, вероятно, должны перейти непосредственно к «правильному» решению.

Серверы, предназначены ждать запроса, который, вероятно, образуют некоторую очередь (если они приходят быстрее, чем сервер может обрабатывать их). У вас уже есть List<Request> requests, что вы, вероятно, хотели бы использовать в коде. Но простой список не предоставляет вам эту опцию «wait».

Используйте BlockingQueue<Request> requests вместо (и, например, LinkedBlockingQueue в осущ.)

Сервер:

run() { 
    for(...) { 
     Request request = requests.take(); 
     doSomething(); 
    } 
} 

И где-то в главном

server.requests.add(request); 

В действительности, вы должны достаточно определить один BlockingQueue запросов, которые разделяются всеми серверами, таким образом, какой бы сервер ни был свободным, он будет захватывать запрос из qu EUE. Просто сделайте очередь запросов в качестве параметра конструктора и передайте его серверам.

Тогда основной направит запросы к одной и той же очереди, и они будут обрабатываться любым доступным сервером.

0

Вы не можете перезапустить Thread, который вышел, поскольку Javadoc для Thread.start() и причина, заданная для метания IllegalThreadStateException.

Вам придется создать новую тему.

Смежные вопросы