アプリケーションサーバーで無限のスレッドを停止する方法

私は2つのボタンがあるglassfishの下にJSF Webアプリケーションをデプロイしています。最初は無限のスレッドを開始し、2番目のスレッドは停止します。問題はスレッドを停止できないことです。ネット上のソリューションを検索しましたが私がJ2SEアプリケーションを持っていてもJ2EEアプリケーションではない場合には、vain.itで動作します

package com.example.beans;

import org.apache.commons.lang.RandomStringUtils;

public class MyBusinessClass {
    public static void myBusinessMethod() {
        /* this method takes a lot of time */
        int i = 1;
        while (i == 1) {
            String random = RandomStringUtils.random(3);

            System.out.println(random);

        }
    }
}   


package com.example.beans;

import java.util.Random;
import java.util.TimerTask;

import org.apache.commons.lang.RandomStringUtils;
import org.apache.log4j.Logger;

import com.example.core.RandomUtils;

public class MySimpleRunnableTask implements Runnable {
private Logger logger = Logger.getLogger(MySimpleRunnableTask.class);

    @Override
    public void run() {
        MyBusinessClass.myBusinessMethod();
    }
}


@ManagedBean(name = "MainView")
@SessionScoped
public class MainView {

    private static Thread myThread;

    @SuppressWarnings({ "unchecked", "rawtypes", "deprecation" })
    public String startSimpleThread() throws SecurityException,
                                             NoSuchMethodException,
                                             InterruptedException {

        MySimpleRunnableTask mySimpleRunnableTask = new MySimpleRunnableTask();
        myThread = new Thread(mySimpleRunnableTask);
        myThread.start();
        return null;
    }

    @SuppressWarnings({ "unchecked", "rawtypes", "deprecation" })
    public String stopSimpleThread() throws SecurityException,
                                            NoSuchMethodException, 
                                            InterruptedException {
        myThread.interrupt();
        return null;
    }
}

私は自分のコードを変更して、本当に自分の問題が何であるかを理解することができます

1
JSFコードでスレッドを作成することは許可されていますか?
追加された 著者 Raedwald,

1 答え

割り込みはスレッドの割り込みステータスをtrueに設定するだけです。スレッドは、実行を停止するために割り込みステータスフラグを定期的にプールする必要があります。

public void run() {
    /* you will have to touch the code here */
    int i = 1;
    while (i == 1) {
        String random = RandomStringUtils.random(3);
        logger.info(random);
        if (Thread.currentThread().isInterrupted()) {
           //the thread has been interrupted. Stop running.
            return;
        }
    }
}

スレッドを適切に停止するには、これが唯一の方法です。停止するように依頼してください。実行スレッドからの協力がなければ、クリーンな方法はありません。

0
追加された
それは私の無限ループコードに触れることなくそれを停止したい問題です
追加された 著者 BenMansourNizar,
私のポストを見て、あなたは私の問題が何かを理解するでしょう
追加された 著者 BenMansourNizar,
私は適切に気にしない、または私のスレッドを停止する
追加された 著者 BenMansourNizar,
はい、それだけですが、私のfreindは私に非常に簡単な解決策を教えてくれました:)。それが削除されてもmyThread.stop()を使用してください。 :) 再度、感謝します
追加された 著者 BenMansourNizar,
merci beaucoup pour ton aide :)
追加された 著者 BenMansourNizar,
私が言ったように、方法はありません。私が見る唯一の解決策は、本当に醜いですが、RandomStringUtils.random()メソッドまたはlogger.info()メソッドは、スレッドを停止する必要があると実行時例外をスローさせることです。なぜ2行のコードを追加したくないのですか?
追加された 著者 JB Nizet,
私はそれを読みやすくするためにコードを再フォーマットしました。私が正しく理解していれば、ランダムな文字列の無限ループはあなたのビジネスメソッドによって実行される実際のコードではありません。このビジネスメソッドが返されるまでには時間がかかります。そうですか?しかし、解決策は変わりません。ビジネスメソッドの中では、現在のスレッドが中断されているかどうかを定期的にチェックし、割り込みステータスが真であるとすぐに(通常はInterruptedExceptionをスローするなどして)このメソッドから戻る必要があります。
追加された 著者 JB Nizet,
それは良い理由のために非難されています。あなたはそれを使用すべきではありません。
追加された 著者 JB Nizet,