【问题标题】:Sharing data between threads of different classes obejcts that don't share similar fields or methods [closed]在不共享相似字段或方法的不同类对象的线程之间共享数据[关闭]
【发布时间】:2021-01-30 21:16:07
【问题描述】:

上下文:这是一项任务,所以我不想要完整的解决方案。 我有一个服务器、网络和客户端、交易和帐户类。网络、客户端和服务器都扩展线程。

  • Network:Network 类提供了允许 客户端和服务器处理事务。客户和 服务器需要先连接(使用 connect())到网络 交换。 Network 类还实现了一个输入缓冲区 (inComingPacket[]) 和输出缓冲区 (outGoingPacket[]) 分别接收来自客户端的交易并返回 向客户更新交易。这些缓冲区的容量是 10 个元素,因此网络会指示它们是满的还是空的。
  • Client:Client 类从文件 (transaction.txt) 中读取所有事务,并 将它们保存在一个数组中(transaction[])。事务由 交易类。 客户端使用 Network 类的 send() 方法传输事务 到网络输入缓冲区,并在网络输入缓冲区的情况下产生 cpu 已满。 此外,客户端使用 Network 类的 receive() 方法检索 从网络输出缓冲区更新事务并产生 cpu 以防万一 缓冲区是空的。收到的每个更新交易都会立即显示 在控制台上。
  • Server:Server 类从文件 (account.txt) 中读取所有帐户并保存 它们在一个数组(帐户[])中。帐户由 Accounts 类实现。 服务器使用 Network 类的 transferrIn() 方法检索 来自网络输入缓冲区的事务并执行操作 (取款、存款、查询)特定账户。它会产生 cpu,以防万一 缓冲区为空。 每个更新的事务都使用 Network 类的 transferOut( ) 方法和服务器产生 cpu 以防万一 缓冲区已满。
  • 主要的 Driver 类(不可触及):
       Network objNetwork = new Network("network");
       objNetwork.start();
       Server objServer = new Server();
       objServer.start();
       Client objClient1 = new Client("sending");
       objClient1.start();
       Client objClient2 = new Client("receiving");
       objClient2.start();

网络字段及其构造函数

    private static int maxNbPackets;
    private static int inputIndexClient, inputIndexServer, outputIndexServer, outputIndexClient;                   /* Network buffer indices for accessing the input buffer (inputIndexClient, outputIndexServer) and output buffer (inputIndexServer, outputIndexClient) */
    private static String clientIP;                            /* IP number of the client application*/
    private static String serverIP;                            /* IP number of the server application */
    private static int portID;                                 /* Port ID of the client application */
    private static String clientConnectionStatus;              /* Client connection status - connected, disconnected, idle */
    private static String serverConnectionStatus;              /* Server connection status - connected, disconnected, idle */
    private static Transactions inComingPacket[];              /* Incoming network buffer */
    private static Transactions outGoingPacket[];              /* Outgoing network buffer */
    private static String inBufferStatus, outBufferStatus;     /* Current status of the network buffers - normal, full, empty */
    private static String networkStatus;  
Network(String context)
      { 
         int i;  
        
         /* Initialization of the network components */
        if (context.equals("network"))
          {
            System.out.println("\n Activating the network ...");
            clientIP = "192.168.2.0";
            serverIP = "216.120.40.10";
            clientConnectionStatus = "idle";
            serverConnectionStatus = "idle";
            portID = 0;
            maxNbPackets = 10;
            inComingPacket = new Transactions[maxNbPackets];
            outGoingPacket = new Transactions[maxNbPackets];
            for (i=0; i < maxNbPackets; i++)
            {   inComingPacket[i] = new Transactions();
                outGoingPacket[i] = new Transactions();
            }
            inBufferStatus = "empty";
            outBufferStatus = "empty";
            inputIndexClient = 0;
            inputIndexServer = 0;
            outputIndexServer = 0;
            outputIndexClient = 0;
            networkStatus = "active";
        }
        else /* Activate network components for client or server */
            System.out.println("\n Activating network components for " + context + "...");
      }     

服务器字段和构造函数

int numberOfTransactions;         /* Number of transactions handled by the server */
    int numberOfAccounts;             /* Number of accounts stored in the server */
    int maxNbAccounts;                /* maximum number of transactions */
    Transactions transaction;         /* Transaction being processed */
    Network objNetwork;               /* Server object to handle network operations */
    Accounts [] account;
Server()
    {
      System.out.println("\n Initializing the server ...");
      numberOfTransactions = 0;
      numberOfAccounts = 0;
      maxNbAccounts = 100;
      transaction = new Transactions();
      account = new Accounts[maxNbAccounts];
      objNetwork = new Network("server");
      System.out.println("\n Inializing the Accounts database ...");
      initializeAccounts( );
      System.out.println("\n Connecting server to network ...");
      if (!(objNetwork.connect(objNetwork.getServerIP())))
      {
        System.out.println("\n Terminating server application, network unavailable");
        System.exit(0);
      }
    }

我不会给客户上课,因为我想你明白了。我的工作本质上是实现所有这些类的运行功能。但是我看不到他们的线程如何能够像他们需要的那样共享数据,而且我需要考虑并发性。 请给点建议,抱歉这么久。

【问题讨论】:

  • 也许你应该告诉你的老师你不知道如何开始,他们应该帮助你。他们为此得到报酬。这个问题对于 Stack Overflow 来说似乎太宽泛了。
  • 1) 线程安全的集合,如 LinkedBlockingQueue 等,2) PipedInputStream 等

标签: java multithreading intellij-idea concurrency transactions


【解决方案1】:

我认为您应该做更多的研究并亲自尝试一些展示 Java 并发性和您所询问的领域的在线教程;同步。即谷歌搜索:'java并发教程'和'java同步方法'。参考点:https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

您应该通过一些示例来更好地理解:https://www.javatpoint.com/synchronization-in-javahttp://tutorials.jenkov.com/java-concurrency/synchronized.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 2018-03-25
    • 2011-04-20
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多