java - 使用 TCP/IP 套接字的多线程

标签 java multithreading sockets tcp

我正在 Java 中处理套接字。问题是我们正在从硬件设备获取信号,如果在一定时间间隔(200ms)后未扫描设备,则会挂起。所以我需要加快这个操作。如何使用多任务处理来加速以下代码。

此处的行数通常在 250 范围内。

    sock = new Socket("localhost", def.PORT);

    OutputStream outStream = sock.getOutputStream();
    DataOutputStream outDataStream = new DataOutputStream(outStream);
    /**************** Start Command for CystometryEMG *****************/
    outDataStream.writeInt(size);
    outDataStream.writeInt(command);
    outDataStream.writeBytes(msg);

    InputStream input = new BufferedInputStream(sock.getInputStream());
    reader = new DataInputStream(input);

    sock.setSoTimeout(def.SOCKET_READ_TIME_OUT);
    if (sock.isClosed())
        return;
    size = reader.readInt();
    command = reader.readInt();
    errorCode = reader.readInt();
    NoofCols = reader.readInt();
    NoOfRows = reader.readInt();

    /************** Now get the input from the device *************/

    for (int i = 0; i < NoOfRows; i++)
        arrPb[i] = reader.readDouble();

    for (int i = 0; i < NoOfRows; i++)
        arrPv[i] = reader.readDouble();

    for (int i = 0; i < NoOfRows; i++)
        arrV[i] = reader.readDouble();

    for (int i = 0; i < NoOfRows; i++)
        arrVn[i] = reader.readDouble();

    sock.close();

最佳答案

将扫描设备与所有其他操作分离。将其分成两个线程。一个线程(前端)除了扫描设备并将接收到的数据保存到队列中之外不处理任何事情。该线程应以最高优先级运行。第二个线程(后端)从队列中获取数据,并在闲暇时用它做任何你想做的事情。您可能需要多个后端线程,在完成此工作后,您需要调整后端线程的数量,以确保您处理请求的速度比从设备接收请求的速度快,否则您的队列将变得太大。

但请注意,Java 通常不是实时语言,即使使用专用线程,前端线程也可能需要更多时间来安排您可能喜欢的时间。您可以在网络上搜索“realtime java”,看看现有的实时 JVM 是否可以帮助您。

无论如何,不​​要考虑在低于 4 核的 CPU 上运行它

关于java - 使用 TCP/IP 套接字的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20040642/

相关文章:

c++ - 互斥体和锁

python - 无法打开由 Python 中的线程创建的管道描述符

java - Java中线程的问题

Java服务器程序在第二次运行客户端时不接受客户端的输入

java - 无法在 android Studio 中解析符号 'R'

java - 我不明白如何使用带有选项卡的操作栏 sherlock

java - 由于守护线程,Jmeter 未完成

Java多线程套接字客户端/服务器: sending and receiving Enummap objects

c - 通过c中的套接字传递wav文件样本

java - Play框架中相同实体类的一对多