2011-10-28 62 views
1

我有一個JSF Web應用程序部署在Glassfish中,其中有兩個按鈕。第一個啓動一個無限線程,第二個停止它。我的問題是,我無法停止一個運行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; 
    } 
} 

我已經改變了我的代碼,這樣你就可以真正瞭解我的問題

+0

是否允許JSF代碼創建線程? – Raedwald

回答

0

中斷僅將線程中的中斷狀態設置爲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

+0

正如我所說的,沒有辦法。我看到的唯一的解決方案非常難看,那就是在需要停止線程時,使RandomStringUtils.random()或logger.info()方法拋出運行時異常。爲什麼你不想添加必要的兩行代碼? –

+0

看看我的帖子,你會明白我的問題是什麼 – BenMansourNizar

相關問題