Як спыніць бясконцы паток, у серверы прыкладанняў

У мяне ёсць вэб-дадатак JSF разгорнутага пад GlassFish, у якім я два buttons.The першага запуску бясконцую нітку і другую прыпынак it.My праблема заключаецца ў тым, што я не магу спыніць запушчанае thread.I шукалі рашэння на сетцы, але у vain.it работ у выпадку, калі ў мяне ёсць дадатак J2SE, але не з дадаткам J2EE вось мой код

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 адказы

перапыненне толькі ўстанаўлівае статус перапынення ў патоку да ісціны. Нітка павінна рэгулярна аб'ядноўваць сцяг перапынення стану спыніць працу:

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 мой даў мне рашэнне, якое вельмі лёгка :) .Just выкарыстоўваць myThread.stop (), нават калі гэта depreacated. :) Дзякуй зноў
дададзена аўтар BenMansourNizar, крыніца
мерсі Ьеаисоир выліць тоны памочнік :)
дададзена аўтар BenMansourNizar, крыніца
няма Як я ўжо казаў, не так. Адзінае рашэнне, якое я бачу, што гэта сапраўды непрыгожа, каб зрабіць RandomStringUtils.random() або метад logger.info() згенераваць выключэнне падчас выканання, калі вы павінны спыніць паток. Чаму вы не хочаце, каб дадаць неабходныя два радкі кода?
дададзена аўтар JB Nizet, крыніца
Я перафарматаваць код, каб зрабіць яго даступным для чытання. Калі я правільна разумею, бясконцы цыкл з выпадковай радком, не рэальны код, выкананы вашай бізнес-метадам. Гэта проста, што гэты бізнэс метад займае шмат часу, каб вярнуцца. Ці з'яўляецца гэта правільна? Гэта не мяняе рашэнне, хоць. Ўнутры метаду бізнесу, вы проста павінны праверыць як мага больш старанна, калі бягучы струмень быў перапынены ці не, і вяртання з гэтага метаду (звычайна або шляхам выкідання InterruptedException, напрыклад), як толькі статус перапынення дакладна.
дададзена аўтар JB Nizet, крыніца
Гэта асуджаецца па ўважлівых прычынах. Вы не павінны выкарыстоўваць яго.
дададзена аўтар JB Nizet, крыніца