【问题标题】:java multi threading issue ( same run time )java多线程问题(相同的运行时间)
【发布时间】:2014-03-24 22:33:53
【问题描述】:

我有 Java 中的套接字服务器和 PHP 中的其他端套接字客户端

我想通过多线程同时处理来自java中PHP的套接字请求,但是java一个接一个地做,等待完成第一个请求并开始第二个请求,

这是我的 JAVA 代码:

while (true) {
    try {
        clientSocket = serverSocket.accept();
        int i = 0;
        for (i = 0; i < maxClientsCount; i++) {
            if (threads[i] == null) {
                (threads[i] = new clientThread(clientSocket, threads)).start();
                break;
            }
        }
        if (i == maxClientsCount) {
            PrintStream os = new PrintStream(clientSocket.getOutputStream());
            os.println("Server too busy. Try later.");
            os.close();
            clientSocket.close();
        }
    } catch (IOException e) {
        System.out.println(e);
    }
}


class clientThread extends Thread {
    public clientThread(Socket clientSocket, clientThread[] threads) {
        this.clientSocket = clientSocket;
        this.threads = threads;
        maxClientsCount = threads.length;
    }

    public void run() {
        int maxClientsCount = this.maxClientsCount;
        clientThread[] threads = this.threads;
        try {
            in = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
            URL aURL = new URL(RecivedURL);
            // start out put
            System.out.println("host = " + aURL.getHost());
            // end out put

粗体线是我的输出示例,但我想在同一时间同时开始输出多个启动的请求.. JAvA 等待我的代码一次性完成一个请求..

【问题讨论】:

  • 首先,为什么不使用ExecutorService 而不是您自己的怪异代码?我怀疑您的工作运行时间不够长,无法同时发生。
  • 您不应该扩展Thread,只需实现Runnable 并将其提供给普通Thread 类的构造函数即可。
  • 粗线在哪里?你是如何向 Java 提出请求的?
  • 我通过 PHP 套接字方法发送它,就像 write msg ..

标签: java multithreading sockets


【解决方案1】:

我不明白您为什么要在此处使用两个以上的线程。

如果您想一个一个地处理请求,您可以只生成一个线程来监听请求并立即通过发送“处理”或“稍后再检查”消息来响应它。 (称之为监听线程)

如果向客户端发送“处理”响应,则连接保持活动状态,并生成另一个线程,以请求的实际处理结果响应客户端。 (称之为处理线程)。

您可以让侦听器线程向队列中的客户端发送保持活动消息,或者您可以要求它在请求的设定时间段后检查。您可以通过设置队列来决定何时响应发送“稍后再回来”消息的客户端,从而使侦听器线程更加复杂

从实现 POV 来看,您的主线程可能是您的侦听器线程,它可以在处理请求时生成一个处理线程。

【讨论】:

  • 请求是 PHP 在 socket 中发送的,我是 Java 新手,PHP 是一个 Web 服务器,同时发送一些进程是正常的,
  • @kiamoz 很高兴这个想法有所帮助。我不认为使用队列是一个坏主意。确保您的排队规则不会导致“冲突”。实现一个队列来处理请求可能会很棘手。
  • 我是java新手,但我要学习那些技巧:D,谢谢谢谢
【解决方案2】:

我假设它执行得如此之快,以至于在接受下一个请求之前完成了最后一个请求。

出于调试目的尝试添加:

try {
  Thread.sleep(1000);
} catch (InterruptedException e) {
  Thread.currentThread().interrupt();
}

进入 run 方法,这样您就可以更轻松地检查它是否真的没有并行运行。

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多