2013-04-16 41 views
0

我有矢量線程,我想檢查此向量中的所有項目。每個人都是用戶到服務器的連接。我想「清理」所有死亡的連接。 我找不到我錯在哪裏。 這裏是我的代碼:Java線程不殺死其他線程,並不會從矢量項目刪除

/* 
* 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); 
     } 
    } 
} 

package server;

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(new ArrayList())'順便取代。 – Gray

+0

你應該使用'執行器' – Cratylus

+0

大的想法是用戶連接到主機後,我可以與他溝通。所以我決定把它放在Vector中。 通過這種方式,我可以四處走動,找到我想要這個端口的確切人物。然後將它發送給一個字符串,我將閱讀並返回一個答案。例如,從這個答案中,他想要檢查具有加密密碼的用戶。然後,我可以成爲他的遠東或不是。如果是這樣,它會創建一個「會話」,我會寫這個人會話。然後他可以請求你按照我描述的原始程序在數據庫中輸入記錄。 –

回答

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 –