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

zrfyljdw  于 2023-06-04  发布在  Java
关注(0)|答案(3)|浏览(114)

我刚刚接触了多线程,它真的很棒。我发现自己试图找出新的方法,我可以使用它使事情变得更好,我想我找到了一个,但我不确定如何设计的程序。
我有一个队列服务器,多个客户端使用和生成数据,但为了启动这个过程,我运行了一个Java程序,为它们提供一些初始数据。然后我的程序就完成了,队列服务器上有多余的容量,但实际上没有什么在运行。所以我想尝试做一些维护任务,运行一个服务,做一些低优先级的事情。我如何设计一个程序,同时执行完全不同的任务?
通常情况下,我只是把我的程序 Package 在一个while (true)循环中,它只执行一个任务,我意识到我不能在同一个进程中同时执行两个while循环(可能是嵌套的?)为了展示一个简化的示例,我放了一堆运行runnable的代码(也许它会处理一个低优先级队列)和一个监视套接字并回复的服务(我可能想根据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
        
    }
    
}
balp4ylt

balp4ylt1#

我强烈建议你看看这个项目:Java并发动画。我发现这可能是了解Java中并发概念的最佳方法:它是动画的,交互式的,你可以一次只看一个概念,就能很好地理解。
http://sourceforge.net/projects/javaconcurrenta/

bxgwgixi

bxgwgixi2#

看一下java.util.concurrent包。它完全是做你描述的那种事情的好东西。
特别是,请查看Executors工厂类,它允许您构建Thread Pools,允许在指定的任意数量的Threads上调度和并发运行多个任务。
Oracle有一些关于使用Executors的很棒的教程:
http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html
http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html

wz3gfoph

wz3gfoph3#

并发很难,你可以阅读Java Concurrency in Practice,但即使是Maven也有困难。在你所在的地区寻找一个培训课程。我想推荐Concurrency Specialist Courses,它基于Java Concurrency in Practice,并得到作者Brian Goetz的认可。

相关问题