2016-12-15 5 views
0

私は自分のUIからのリクエストに基づいてHotFolderを見る必要があります 私のUIにはスタートボタンとストップボタンがあります。それを見て停止する必要があります停止します。私はHotFolderを見るために時計サービスを使用しています。私は、私のコントローラーからフラッグを渡して、フォルダーの視聴を開始して停止するサービスを見ています。どうすればフォルダの視聴を止めることができますか?ここで 腕時計サービススレッドを殺す方法

は、コードスニペットです:

@RequestMapping(value = "/start", method = RequestMethod.GET) 
public ModelAndView hotFolder() 
{ 
    ModelAndView model = new ModelAndView(); 
    model.setViewName("welcomePage"); 

    HotFolder h = new HotFolder(); 
    h.hotfolderTesting(true); 
    return model; 
} 

@RequestMapping(value = "/stop", method = RequestMethod.POST) 
public ModelAndView hotFolderStop() 
{ 
    ModelAndView model = new ModelAndView(); 
    model.setViewName("welcomePage"); 

    HotFolder h = new HotFolder(); 
    h.hotfolderTesting(false); 
    return model; 
} 

HotFolder.java:私は私はあなたがいると思うしましょう注釈を参照しているので、あなたが言及しなかった確か何かのためにあります

public void hotfolderTesting(boolean flag) 
{ 
    try (WatchService service = FileSystems.getDefault().newWatchService()) { 
     Map<WatchKey, Path> keyMap = new HashMap<>(); 
     Path path = Paths.get("E:\\TestingWatch"); 
     keyMap.put(path.register(service, StandardWatchEventKinds.ENTRY_CREATE), path); 

     WatchKey watchKey; 
     if (flag) { 
      while (true) { 
       watchKey = service.take(); 
       for (WatchEvent<?> event : watchKey.pollEvents()) { 
        if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { 
         System.out.println("Created: " + event.context()); 
        } else if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) { 
         System.out.println("Deleted: " + event.context()); 
        } else if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { 
         System.out.println("Modified :" + event.context()); 
        } 
       } 
       if (!watchKey.reset()) { 
        break; 
       } 
      } 
     } 
    } catch (Exception ignored) { 
    } 
} 

答えて

0

何らかの種類のRESTベースのライブラリを使用しています。

とにかく、コードは決して動作しません。これは、基本的にはあなたの質問に答えたスレッドをウォッチスレッドに変えているので、あなたの仕事を決して行かないからです。 {

public class HotFolder implements Runnable{ 
    private static HotFolder instance = null; 

    public static HotFolder getInstance(){ 
     if(instance == null) 
      instance = new HotFolder(); 
     return instance; 
    } 

    private boolean running = false; 
    private Thread t = null 
    private HotFolder(){ 
    } 

    public setRunning(boolean running){ 
     this.running = running; 
     if(running && t == null){ 
      t = new Thread(this); 
      t.start() 
     }else if(!running && t!= null){ 
      t = null; 
     } 
    } 

    public boolean getRunning(){ 
     return running; 
    } 

    public void run(){ 
     try (WatchService service = FileSystems.getDefault().newWatchService()) { 
      Map<WatchKey, Path> keyMap = new HashMap<>(); 
      Path path = Paths.get("E:\\TestingWatch"); 
      keyMap.put(path.register(service, StandardWatchEventKinds.ENTRY_CREATE), path); 
      WatchKey watchKey; 
      watchKey = service.take(); 
      do{ 
       for (WatchEvent<?> event : watchKey.pollEvents()) { 
        if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { 
         System.out.println("Created: " + event.context()); 
        } else if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) { 
         System.out.println("Deleted: " + event.context()); 
        } else if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { 
         System.out.println("Modified :" + event.context()); 
        } 
       } 
      }while(running && watchKey.reset()); 
     } catch (Exception ignored) { 
     } 
    } 
} 

、その後、あなたは私が公共のボイドsetRunning(ブールランニング)でjava.lang.IllegalThreadStateExceptionを取得しています

//to activate 
HotFolder.getInstance().setRunning(true) 
//to stop it 
HotFolder.getInstance().setRunning(false) 
+0

のようにそれを呼び出す:私は、Singletoパターンを提案し、このようなあなたのホットフォルダのクラスを記述します \t \t this.running = running; \t \t IF(ランニング){ \t \t \t this.start()。 \t \t} \t} – user7076183

+0

[OK]をスレッドを1つ以上のものを開始することはできません。ランナブルを使用するようにコードを変更します。 – bracco23

+0

まだ幸運なことではありませんが、何度かスレッドがnullになってしまいます。停止ボタン(HotFolder.getInstance()。setRunning(false)メソッドを呼び出しています)をクリックしても、まだ新しいファイルがフォルダに作成されていることを記録しています)。 – user7076183

関連する問題