Как остановить бесконечный поток на сервере приложений - PullRequest
1 голос
/ 28 октября 2011

У меня есть веб-приложение JSF, развернутое под Glassfish, в котором у меня есть две кнопки. Первый запускает бесконечный поток, а второй останавливает его. Моя проблема в том, что я не могу остановить работающий поток. Я искал решение наСеть, но 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 Ответ

0 голосов
/ 28 октября 2011

прерывание только устанавливает состояние прерывания в потоке в 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;
        }
    }
}

Это единственный способ правильно остановить поток: попросить его остановить. Без сотрудничества с бегущей нитью нет чистого пути.

...