1

インターネット上に同様の質問がすでにたくさんあることは承知していますが、私の質問は私のコードに関するものであり、スレッドに関するものではありません。プレーヤーのデータベースを持つ小さなアプリを作成しています。データ格納クラスのコードは次のとおりです。

public class DataManager 
{
static final int NO_OF_COLUMNS = 18;
static QDatabase pdb;

public DataManager()
{
    pdb = new QDatabase(NO_OF_COLUMNS);
}

public void addPlayer(Object[] playerData)
{
    pdb.add(playerData);
}

public void editPlayerInfo(int type, int playerRegNo, Object data)
{
    pdb.set(type, playerRegNo, data);
}

public int getPlayerRegNo(String userID)
{
    return (int) pdb.getData(USER_ID, userID, REG_NO);
}

public Boolean contains(int column, Object data)
{
    return pdb.contains(column, data);
}
}

複数のクライアントからリクエストを受信し、それぞれに新しいスレッドを作成し続けるサーバーがあります。それらはすべて、基本的にデータベースとして機能するこの DataManager クラスにアクセスします。addPlayer()何らかの方法で、すべてのスレッドがメソッドとeditPlayerInfo()メソッドを同時に呼び出すことができるようにすることはできますか?

また、データベースを使用できることも知っています。しかし、ここでは、これは簡単だと思いました。約 200 のスレッドが同時に実行されると想定します。これを解決する最善の方法は何ですか?

すべてのスレッドが同時にアクセスできるようにする方法はありますか?そうしないと、200 のスレッドが互いに待機すると非常に遅くなる可能性があります。

編集 1: QDatabase クラスは次のとおりです。

public class QDatabase implements Serializable
{
    private ArrayList<ArrayList<Object>> database;
    public final int NOT_EXISTS = 0, REGULAR = 0, TRANSPOSE = 1;
    private int lastid = -1;

    //Initializer taking the number of columns as an argument
    public QDatabase(int noofcolumns)
    {
        database = new ArrayList<ArrayList<Object>>();
        addColumns(noofcolumns);
    }

    //Method that adds an array of objects as a new row in the database.
    public void add(Object[] object)
    {
        for(int index = 0; index < database.size(); index++)
        {
            if(object != null)
            {
                database.get(index).add(object[index]);
                lastid = database.get(0).indexOf(object[0]);
            }
        }
    }

    //Method that finds the row in a column where an instance of a particular object is found and get the values at a 
    //cell with the same row and a given column.
    public Object getData(int columntocheck, Object check, int columntoget)
    {
        Object ramobject = null;

        int loc = database.get(columntocheck).indexOf(check);
        ramobject = database.get(columntoget).get(loc);

        return ramobject;
    }

    //Method to check if a column contains an instance of a given object.
    public Boolean contains(int column, Object objecttocheck)
    {
        return database.get(column).contains(objecttocheck);
    }

    //Method to set a given cell to an object.
    public void set(int column, int row, Object object)
    {
        database.get(column).set(row, object);
    }
}
4

4 に答える 4

0

同期ブロックを追加するだけ

public synchronized void addPlayer(Object[] playerData)
{
    pdb.add(playerData);
}

public synchronized void editPlayerInfo(int type, int playerRegNo, Object data)
{
    pdb.set(type, playerRegNo, data);
}

2 つのスレッドが同時にこのメソッドにアクセスしないようにします。

于 2013-04-28T03:29:35.120 に答える
0

Have a look at the java.util.concurrency package. You could use classes there to manage your threading needs better.

In order for a class/ method to be "thread safe" it has to be designed so. Now, its not clear what the DATABASE object you have is doing internally but it does look like from the method names , that multiple threads ARE going to be an issue.

In order to INCREASE the number of threads , yet not keeping the ENTIRE method synchronized, look into the details of the add/edit methods implementations and , yes you would have to limit thread access to those lines of code that would cause issues.

You could use principles like multiple READ ,single WRITE locks etc.

于 2013-04-28T04:03:37.557 に答える