java - 如何设计一个同时执行完全不同任务的程序?

标签 java

我刚刚接触了多线程,它真的很棒。我发现自己试图找出新的方法来使用它让事情变得更好,我想我找到了一种,但我不确定如何为此设计程序。

我有一个队列服务器,多个客户端可以使用该队列服务器并生成数据,但为了启动该进程,我运行了一个 Java 程序,以放置一些初始数据供它们启动。然后我的程序完成了,队列服务器上有多余的容量,但没有任何东西真正在上面运行。所以我想尝试做一些维护任务,运行服务,并做低优先级的事情。但我不知道该怎么做。如何设计一个同时执行完全不同任务的程序?

通常,我只是将程序包装在 while (true) 循环中,它执行单个任务,并且我意识到我不能在同一个进程中同时执行两个 while 循环(可能是嵌套的? )。为了展示一个简化的示例,我放置了一堆运行可运行程序的代码(也许它将处理低优先级队列)和一个监视套接字并回复的服务(我可能想根据 CPU 使用情况添加更多代码)。我如何让他们一起工作?有没有更好的方法来设计它(我知道从长远来看,运行多个Java进程可能会更好,但现在我只是想管理一个文件,我怀疑有一种方法可以给套接字服务比处理套接字服务更高的优先级)在文件中排队,但如果它们都在不同的文件中运行,我不知道如何降低一个文件的优先级,而不是争夺资源)?

简而言之,我希望它向其他系统(在示例中为服务器套接字)提供服务,并且当其空闲时我希望它执行一些其他任务。

示例(如果您理解我的要求,则可能不需要阅读此代码):

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class multipleThreads {

    private ServerSocket server;
    private int port = 7777;

    public void ServerSocketExample() {
        try {
            server = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("starting");
        
        ServerSocketExample example = new ServerSocketExample();
        example.handleConnection();
        
        while (true) {
            //monitor low low priority queue
        }       
    }
    public void handleConnection() {
        System.out.println("Waiting for client message...");

        //
        // The server do a loop here to accept all connection initiated by the
        // client application.
        //
        while (true) {
            try {
                Socket socket = server.accept();
                new ConnectionHandler(socket);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

class ConnectionHandler implements Runnable {
    private Socket socket;

    public ConnectionHandler(Socket socket) {
        this.socket = socket;

        Thread t = new Thread(this);
        t.start();
    }

    public void run() {
        try
        {
            //
            // Read a message sent by client application
            //
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            String message = (String) ois.readObject();
            System.out.println("Message Received: " + message);

            //
            // Send a response information to the client application
            //
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject("Hi...");

            ois.close();
            oos.close();
            socket.close();

            System.out.println("Waiting for client message...");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class MonitorQueue implements Runnable{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        //do work when stuff comes in the queue
        
    }
    
}

最佳答案

我强烈建议您看一下这个项目:Java Concurrent Animated。我发现这可能是了解 Java 并发概念的最佳方式:它是动画的、交互式的,而且您一次只需了解一个概念即可得到很好的理解。

http://sourceforge.net/projects/javaconcurrenta/

关于java - 如何设计一个同时执行完全不同任务的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10165710/

相关文章:

java - postgres 表不显示默认值

java - 添加/累积 "line chart components"

java - Spring 缓存不起作用

java - 尝试使用 KeyListeners 和 ImageIcons 时出现错误?

java - 如何在 Java Swing 中将 ScrollBar 添加到 JTextArea?

java - Log4j2在java程序中断之前不会写入文件

java - Jpanel 不响应 Repaint 或 revalidate 方法

java - JAVA中Class内容排列问题

java - 按位运算符 >>> 在 hashCode

java - 根据我调用 get() 方法的方式不同的输出