-1

Java で単純な Web サーバーを作成しようとしていますが、それを停止することに固執しています。サンプルコードの一部を次に示します。

    public static void main(String... args) {

    args = new String[]{"stop"};
    Server s = Server.getServerInstance();
    s.init();
    if (args.length > 0) {
        for (int i = 0; i < args.length; i++) {
            if (args[i].equals("start")) {
                   System.out.println(s);
                   s.start();
            } else if (args[i].equals("stop")) {
                   System.out.println(s);
                   s.stop();
            }
        }
    }
}

public class Server {

private static Server serverInstance = null;
private volatile boolean running = false;
private Thread serverthread = null;


private Server() {}

public static synchronized Server getServerInstance()
{
    if(serverInstance == null)
    {
        serverInstance = new Server();
    }
    return serverInstance;
}

public void init()
{
    Runnable r = new ServerThread();
    serverthread = new Thread(r);
}

public void start()
{
    running = true;
    if(serverthread!=null)
    {
        serverthread.start();
    }
}

public void stop()
{
    running = false;
    if(serverthread!=null)
    {
        try {
            serverthread.join(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

class ServerThread implements Runnable
{
    @Override
    public void run() {
        while(running)
        {
            //some action here...
            System.out.println("RUNNING..");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

}

これらすべてのコードを jar ファイルにパッケージ化し、 java -cp *.jar CLASS_NAME args commend を使用してサーバーを起動および停止しました。サーバーは起動できますが、停止引数へのパスによって停止されたことはありません。デバッグしたところ、実行中のブール値が変更されないことがわかりました..なぜですか? stop メソッドをエレガントな方法で実装するにはどうすればよいですか? ありがとう !!!!

4

2 に答える 2

0

あなたのコードに基づいて、停止しようとしているサーバーのインスタンスは実行中のものではないと思います。

代わりに、これを試してください。

public static void main(String... args) {

    Server s = Server.getServerInstance();
    s.init();
    s.start();
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    s.stop();
}

これによりサーバーが起動し、5 秒待ってから閉じます。

別のプロセスで実行されているサーバーを停止する場合は、ソケットなどを使用してクロスプロセス通信を有効にすることを検討する必要があります。

于 2013-04-23T02:38:20.403 に答える