Java线程不要杀死其他线程,也不要从向量项中删除

时间:2013-04-16 20:54:20

标签: java multithreading vector

我有线程矢量,我想检查此向量中的所有项目。每个人项目都是用户与服务器的连接。我想“清理”所有死亡的联系。 我找不到我错的地方。 这是我的代码:

/*
 * 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 个答案:

答案 0 :(得分:0)

注意:我假设Clients延伸Thread

看起来您可能错误地使用interrupt()。在调用user.interrupt()之后,由该线程决定是否已通过调用Thread.interrupted()来中断它并且如果为真则终止自身。这是一个非常基本的例子:

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