2013-04-16 8 views
0

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

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package server; 

import java.util.Iterator; 
import java.util.Vector; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import server.ServerCore.Clients; 

/** 
* 
* @author pisio 
*/ 
public class GrimReaper extends Thread { 

    private int timeout = LoadSettings.Init().getConfigInt("grimreaper") * 1000; // 1000 ms = 1 sec 

    public GrimReaper() { 
     super(); 
    } 

    public void cleanUserThreads() { 
     Vector users = ServerCore.users; 
     if (users.size() < 1) { 
      return; 
     } 
     Iterator iteratr = users.iterator(); 
     while (iteratr.hasNext()) { 

      Clients user = (Clients) iteratr.next(); 
      System.out.println(user.isAlive()); 
      if (user.getClient().isClosed()) { 
       user.interrupt(); 
       if (user.isInterrupted()) { 
        System.out.println("Beshe kiknat"); 
       } 
       iteratr.remove(); 
       // if (PublicVaribles.Init().systemLevelMesseging() == 2) { 

       System.out.println("+\t Kicked user "); 
       // } 
      }//if is dead 
     }//while 
    }//cleanUserThreads; 

    @Override 
    public void run() { 
     try { 
      while (ServerCore.getServerRunning()) { 

       cleanUserThreads(); 
       sleep(timeout); 
       System.out.println("nani na shinigami"); 
      } 

     } catch (InterruptedException ex) { 
      Logger.getLogger(GrimReaper.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

пакет сервера;

import java.io.*; 
import java.net.*; 
import java.util.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import server.DB.DataBase; 

public class ServerCore extends Thread { 

    private static ServerCore sc = null; 
    private int port = LoadSettings.Init().getConfigInt("port"); 
    private int max_connections = LoadSettings.Init().getConfigInt("max_connections"); 
    private String ipServer = LoadSettings.Init().getConfig("ipServer"); 
    private ServerSocket socket; 
    private static boolean serverRuning = false; 
    public static Vector users = new Vector(); 
    public GrimReaper shinigami = new GrimReaper();// Shinigami from Japanice is Grim Reaper! 

    private ServerCore() { 
    } 

    @Override 
    public void run() { 

     shinigami.start(); 

     try { 
      socket = new ServerSocket(port, max_connections); 

      System.out.println("+++\t Server was started at address:" + socket.getLocalSocketAddress() + " with posible max users " + max_connections); 

      serverRuning = true; 

      while (serverRuning) { 
       Socket client = socket.accept(); 
       shinigami.cleanUserThreads(); 
       if (users.size() < max_connections) { 

        Clients cls = new Clients(client); 
        cls.start(); 
        users.add(cls); 
        System.out.println("++\tClient was connected:" + client.toString()); 
       } else { 
        Clients cls = new Clients(client); 
        cls.start(); 
        cls.getOutput().println("sorry_no_avable_slot"); 
        cls.getOutput().flush(); 
        cls.interrupt(); 
       } 
      } 


     } catch (IOException ex) { 
      // Logger.getLogger(ServerCore.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
    //run method 

    public void sendUserMsg() { 
     Scanner input = PublicVaribles.Init().inputKeyBord(); 

     System.out.print("Enter UserID/user connection port:"); 
     int userID = input.nextInt(); 


     Iterator iterator = users.iterator(); 
     while (iterator.hasNext()) { 

      Clients cls = (Clients) iterator.next(); 
      /// System.out.println("Passed user:" + cls.getUserId()); 

      if (cls.getUserId() == userID) { 

       System.out.print("\nEnter msg:"); 

       String str = input.next(); 
       cls.getOutput().println(str); 

       System.out.println("+\t" + cls.getUserId() + " get msg :" + str); 


      } 

     } 

    } 
    //SendUserMsg 

    public void stopServer() { 
     statusServer(); 
     serverRuning = false; 
     try { 

      socket.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(ServerCore.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     System.out.println("+++\t SERVER WAS STOPED !"); 
    } 
    //Stop server 

    public void statusServer() { 
     if (serverRuning) { 
      System.out.println("+++\t Server running at port:" + port + " with connected users :" + users.size() + "/" + max_connections); 

     } else { 
      System.out.println("+++\t Server IS NOT RUNNING!"); 
     } 
    } 
    //Status server 

    public static boolean getServerRunning() { 
     // function for GrimReaper .... R.I.P :D 
     return ServerCore.serverRuning; 
    } 

    public static ServerCore Init() { 
     if (ServerCore.sc == null) { 
      ServerCore.sc = new ServerCore(); 
     } 
     return ServerCore.sc; 
    } 
// SingleTon 

    public class Clients extends Thread { 

     private Socket client; 
     private int userID; 
     private Scanner input; 
     private PrintWriter output; 

     public Clients(Socket socket) { 
      client = socket; 
      userID = socket.getPort(); 

      try { 
       input = new Scanner(client.getInputStream()); 
       output = new PrintWriter(client.getOutputStream(), true); 
      } catch (IOException ioEx) { 
       System.out.println(ioEx.toString()); 
      } 
     } 

     public int getUserId() { 
      return userID; 
     } 

     public Scanner getInput() { 
      return input; 
     } 

     public PrintWriter getOutput() { 
      return output; 
     } 

     public Socket getClient() { 
      return client; 
     } 
    }//Clients Class 
} 
+1

Какое поведение сейчас? Можете ли вы объяснить, почему вы не думаете, что он работает. 'Vector' был давно заменен на' Collections.synchronizedList (новый ArrayList()) 'btw. – Gray

+0

Вы должны использовать 'Executor' – Cratylus

+0

. Большая идея - после подключения пользователей к хосту, тогда я могу общаться с ним. Поэтому я решил поместить его в «Вектор». Таким образом, я могу ходить и найти точного человека, которого я хочу в этом порту. Затем отправьте его в строку, которую я прочитаю и верну ответ. Из этого ответа, например, он хочет проверить, есть ли пользователь с зашифрованным паролем. Тогда я тоже мог бы быть его даром или нет. Если это так, он создаст «сеанс», и я напишу, что этот человек встречает сеанс. Затем он может попросить вас ввести запись в базу данных, выполнив описанную мной примитивную процедуру. –

ответ

0

Примечание: Я предполагаю, что Clients расширяет Thread.

Похоже, что вы использовали interrupt(). После вызова user.interrupt(), это зависит от этого потока, чтобы проверить, что он был прерван, вызвав Thread.interrupted() и завершающий себя, если true. Вот очень простой пример:

class Clients extends Thread { 
    @Override 
    public void run() { 
     while (!Thread.interrupted()) { 
      //do work 
     } 
     //thread has been interrupted and quits 
    } 
} 
+0

Спасибо, но это не помогает. –

+1

Ну, ваша проблема действительно не совсем понятна. Я пошел вперед и взял удар, но вам нужно сделать работу, чтобы объяснить нам эту проблему. –

+0

Я думаю, если вы увидите, что ServerCoreshte может понять. Я ненавижу языковой барьер ... В приведенном выше сообщении я точно описал, какого эффекта я хочу достичь. Извините, если я был груб. Я отредактировал свой основной пост и поставил ServerCore –

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

  • Нет связанных вопросов^_^