2013-04-16 13 views
10

से अधिक थ्रेड का उपयोग करें मैं जावाएफएक्स के साथ नया हूं और मुझे थ्रेड के साथ एक छोटी सी समस्या है: मैं इसे दो बार निष्पादित कर सकता हूं और मुझे क्यों नहीं मिल रहा है।जावाएफएक्स:

Task<Void> task = new Task<Void>() { 
    @Override public Void call() throws ImageLoadedException, HomographyException, IOException { 
     try{ 
      System.out.println("GO !"); 
      return null; 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    @Override 
    protected void succeeded() { 
     super.succeeded(); 
     System.out.println("SUCCEEDED"); 
    } 
}; 

@FXML protected void launch(ActionEvent event){ 
    new Thread(task).start(); 
} 

जब मैं एक पहली बार बटन पर क्लिक करें जो मेरी धागा शुरू करते हैं, किसी भी समस्या के बिना मेरे कार्य रन (मेरे कंसोल प्रदर्शन "GO!" और ":

यहाँ मेरी कोड की राशि-upt है सफल हुए")।

लेकिन अगर मैं दूसरी बार क्लिक करता हूं, तो कुछ भी शामिल नहीं होता है। क्या मुझसे कुछ गलत हो रही है ? क्या हम एक से अधिक धागे का उपयोग नहीं कर सकते?

+1

सक्रिय कर सकता है नहीं, आप इसका उपयोग नहीं कर सकते एक धागे एक से अधिक बार। – xagyg

उत्तर

11

Thread.start() प्रलेखन से: नहीं

यह कानूनी नहीं है एक बार से एक धागा अधिक शुरू करने के लिए। विशेष रूप से, थ्रेड निष्पादन पूरा होने के बाद पुनरारंभ नहीं किया जा सकता है।

Concurrency in JavaFX ट्यूटोरियल से:

टास्क वर्ग एक बार की वस्तु है कि पुन: उपयोग नहीं किया जा सकता है परिभाषित करता है। यदि आप को एक पुन: प्रयोज्य कार्यकर्ता वस्तु की आवश्यकता है, तो सेवा वर्ग का उपयोग करें।

तो, आपको Task की बजाय Service कक्षा पर विचार करना होगा।


संपादित: यह आपके लिए काम करना चाहिए:

Service<Void> service = new Service<>(task); 

@FXML protected void launch(ActionEvent event){ 
    if (!service.isRunning()) { 
     service.reset(); 
     service.start(); 
    } 
} 
+0

आपकी मदद के लिए बहुत बहुत धन्यवाद। मैं अभी इसके लिए देखूँगा :) – SylCh

+0

निष्पादक को स्वयं सेट करना याद रखें और उसका पुन: उपयोग करें या आप अभी भी हर जगह नए धागे बना रहे हैं। –

+0

@ एंडीटिल क्या आप बेहतर दृष्टिकोण सुझा सकते हैं? – tarrsalah

0

एक wraper वर्ग

  import java.io.IOException; 
      import javafx.concurrent.Task; 

      public class Executor { 
       private String name; 
       private Task<Void> task; 

       public Executor(final String name) { 
        this.name=name; 
        task = new Task<Void>() { 
         @Override 
         public Void call() throws IOException, InterruptedException { 
          try { 
           int i=0; 
           while(i<20){ 
            System.out.println(name); 
            Thread.sleep(2000); 
            i++; 
           } 
           return null; 
          } catch (IllegalThreadStateException e) { 
           System.out.println(e); 
          } 
          return null; 
         } 

         @Override 
         protected void succeeded() { 
          super.succeeded(); 
          try { 
           System.out.println(name+" finish"); 
          } catch (Exception ex) { 
           System.out.println(ex); 
          } 
         } 
        }; 
       } 

       public void start() { 
        try { 
           Thread th = new Thread(task); 
           th.start(); 
          } catch (Exception ex) { 
           System.out.println(ex); 
          } 
       } 
      } 
+0

आपका कोड प्रश्न के साथ कैसे मदद करता है? –

+1

आप चाहें उतनी बार कार्य चला सकते हैं –

1

एक बटन के साथ साथ कर नए कार्य

    Button btn = new Button(); 
        btn.setText("New task"); 
        btn.setOnAction(new EventHandler<ActionEvent>() { 
         @Override 
         public void handle(ActionEvent event) { 
          Executor ex=new Executor("Task"+count); 
          ex.start(); 
          count++; 
          System.out.println("Task Starting..."); 
         } 
        });