2

マルチスレッドで足を濡らしたばかりで、本当に素晴らしいです。私はそれを使って物事をより良くすることができる新しい方法を見つけようとしていることに気づき、それを見つけたと思いますが、このためのプログラムを設計する方法がわかりません。

これが状況です。複数のクライアントがデータを消費して生成するキューサーバーがありますが、プロセスを開始するために、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

    }

}
4

3 に答える 3

3

このプロジェクトをご覧になることを強くお勧めします: Java Concurrent Animated。Java の並行処理の概念を理解するには、おそらくこれが最良の方法であることがわかりました。Java はアニメーション化され、対話型であり、一度に 1 つの概念を理解するだけでよく理解できます。

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

于 2012-04-15T20:45:51.220 に答える
2

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

于 2012-04-15T20:31:56.257 に答える
0

Java Concurrency in Practice を読むことができますが、専門家でさえ困難を抱えています。お住まいの地域でトレーニングコースを探してください。Java Concurrency in Practice に基づいており、著者の Brian Goetz によって承認されているConcurrency Specialist Coursesをお勧めします。

于 2012-04-22T04:04:15.957 に答える