2016-03-22 47 views
1

Belirli bir süre sonra iş parçamı durdurmak istiyorum. Burada örnek kodumu ekledim. İş parçacığının herhangi biri 6 saniyeden uzun sürüyorsa, belirli bir iş parçacığını durdurmak istiyorum. İpin geri kalan kısmı etkilenmemelidir. Zamanlayıcıyı mı, yoksa daha iyi bir şekilde elde etmem mi gerekiyor? Eğer Timer kullansaydım, her iş parçacığı için yeni bir zamanlayıcı oluşturmam gerektiğini ve işin 6sec'den önce bitmesi durumunda zamanlayıcıyı iptal etmem gerektiğini varsayalım?İş parçacığını belirli bir süre sonra durdurun

class MyRunnableThread implements Runnable{ 

    public static int myCount = 0; 
    private String fname = null; 
    public MyRunnableThread(String fname){ 
     this.fname = fname; 
    } 
    public void run() { 

      try{ 
       //read the content based on text and peforms the operation 
       //File.read(this.fname) 
       System.out.println("Run method stuff"+ this.fname); 
      } catch (Exception iex) { 
       System.out.println("Exception in thread: "+iex.getMessage()); 
      } 
    } 

} 

public class RunMyThread { 

    public static void main(String a[]){ 
     System.out.println("Starting Main Thread..."); 

     String[] fname = {"file1.txt","file2.txt","file3.txt","file4.txt","file5.txt"}; 
     for(int i=0;i<5;i++){ 
      try{ 
       MyRunnableThread mrt = new MyRunnableThread(fname[i]); 
       Thread t = new Thread(mrt); 
       System.out.println("Main Thread start "+i); 
       t.start(); 

       //stop the thread support run method takes more than 6seconds 
       System.out.println("Main Thread end "+ i); 
      } catch (Exception iex){ 
       System.out.println("Exception in main thread: "+iex.getMessage()); 
      } 
     } 
     System.out.println("End of Main Thread..."); 
    } 
} 
+0

kullanmayı düşünün [ 'ExecutorService'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html) + [Gelecek] (https://docs.oracle.com/javase/8/ docs/api/java/util/concurrent/Future.html) gibi amaçlar için özel olarak tasarlanmış ve büyük işlevler sunmaktadır. –

cevap

0

Kullanıcı bir Timer ve bir bayrak durdurmak için iplik anlatmak için:

public class MyRunnableThread implements Runnable { 

    boolean run = true; 

    String fname; 

    public MyRunnableThread(String fname) { 
     this.fname = fname; 
    } 

    public void setRun(boolean toSet) { 
     run = false; 
    } 

    public void run() { 
     while (run) { 
      doStuff(); 
     } 
    } 

    private void doStuff() { 
//  File.read(fname); 
    } 
} 

Nasıl kullanılır:

import java.util.Timer; 
import java.util.TimerTask; 

public class Tester { 

    public static void main(String args[]) { 

     String[] fname = { "file1.txt", "file2.txt", "file3.txt", "file4.txt", "file5.txt" }; 
     for (int i = 0; i < 5; i++) { 
      try { 

       MyRunnableThread mrt = new MyRunnableThread(fname[i]); 
       Thread t = new Thread(mrt); 
       t.start(); 

       final Timer timer = new Timer(); 
       timer.scheduleAtFixedRate(new TimerTask() { 
        int i = 6; // Time in seconds 

        public void run() { 
         System.out.println(i--); 
         if (i < 0) { 
          timer.cancel(); 
          mrt.setRun(false); 
         } 
        } 
       }, 0, 1000); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Değiştir saniyede ne zaman

istiyorum ben üzere
+0

Daha iyi bir çözümle düzenlenmiş – Tim

+0

Bu, tüm iş parçacığını (6 saniyeden fazla çalışan) tek bir noktada mı yoksa her bir iş parçacığını mı durduruyor? Açıkça, zamanlayıcı obj mrt obj ile sıkı sıkıya bağlı mı? mrt ve zamanlayıcı her döngü için yeni objedir. Üçüncü obj zamanlayıcı mrt'un üçüncü objesini durduracak mı? – user1023675

+0

Her Thread kendi kendine sahip 6 Threads ve 6 Timer var. Ama aynı zamanda onları aynı anda başlatırsanız, hepsi 6 saniye sonra aynı anda biteceklerdir. – Tim

0

Şey .. Bunu yapmanın birçok yolu var, bunlardan birini açıklayacağım.

Sen run() ve CancelCurrentThread(), koşunuz Thread ve CancelCurrentThread() o istisnaları göz ardı duracaktır başlayacak yöntemini extends Thread o özel bir sınıf oluşturmak ve daha sonra uygulayabilirsiniz. tüm konuları içeren bir ArrayList var

mCustomThread thread = new mCustomThread(parametres_if_you_need); 
thread.start(); //Start the Thread 
thread.join(6000); //Adding 6 seconds 
//You can detect if the 6 seconds have passed or not for example using a timer, then if it joins on this if condition you can call 
thread.CancelCurrentThread(); 
+0

Cevabınız hakkında net değilim, örnekleri sağlayabilir misiniz? – user1023675

1

Bir düşünce olacaktır: gibi

Sonra kod bakmak gerekir. Sonra

her iş parçacığı ekstra bir alan var olun Ardından

Bir zamanlayıcı Arraylist döngü ve 6 saniye önce> başladığı yere konuları durdurma var (Zaman Damgası başladı)

İlgili konular