マルチスレッドで足を濡らしたばかりで、本当に素晴らしいです。私はそれを使って物事をより良くすることができる新しい方法を見つけようとしていることに気づき、それを見つけたと思いますが、このためのプログラムを設計する方法がわかりません。
これが状況です。複数のクライアントがデータを消費して生成するキューサーバーがありますが、プロセスを開始するために、Javaプログラムを実行して、クライアントが開始するための初期データをいくつか配置します。その後、プログラムが完了し、キューサーバーに過剰な容量がありますが、実際には何も実行されていません。だから私はいくつかのメンテナンスタスクを実行し、サービスを実行し、優先度の低いものを実行したいと思っていますが、それをどのように行うのかわかりません。まったく異なるタスクを同時に実行するプログラムを設計するにはどうすればよいですか?
通常、私はプログラムをwhile (true)
ループでラップするだけで、1つのタスクを実行しますが、同じプロセスで2つの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
}
}