Java iş parçacığı iki kez çağrılabilir

public class GetCurrentPrice implements Runnable{
   public void run(){
     //some business logic
   }
}



public class Main{
   public static void main(){
       GetCurrentPrice gcp = new GetCurrentPrice();
       Thread t = new Thread(gcp);
       while(true){
           t.start();
           //once this thread execution is complete, restart this thread.
        }
   }
}

Bu java.lang.IllegalThreadStateException atar. Ne elde etmeye çalışıyorum, bu iş parçacığını bir kez çalıştırın, tamamlandığında, bu iş parçacığını yeniden çalıştırın, tamamlanmasını bekleyin.

3
Kontrol etmek için API'yi bulamadınız mı? Sorun değil, işte burada: docs.oracle.com/javase/7/docs/api/java/lang/… . Btw 4 upvotes? Buradaki kullanıcılar kesinlikle ben değil.
katma yazar Tom, kaynak
katma yazar CSCH, kaynak

7 cevap

Hayır, bunu yapamazsın. Thread.start() API'sinden: Bir iş parçacığını bir kereden fazla başlatmak yasal değildir.

5
katma
Başka bir alternatif ise, çalışmayı bitirmek yerine iş parçacığını beklemekle engellemektir. Daha sonra gerekirse başka bir Thread'den aynı kilitle bildirebilirsiniz.
katma yazar Davide Lorenzo MARINO, kaynak
İlk iş parçacığı oluşturduğunuz şekilde yeni bir iş parçacığı oluşturmanız gerekir.
katma yazar MadConan, kaynak
Programlamayı manuel olarak yapmaya çalışmak yerine sadece bir yürütücüyü kullanmak çok daha iyidir.
katma yazar azurefrog, kaynak
Tamam, o zaman hedefe ulaşmak için alternatif nedir?
katma yazar JavatheComputeguy02, kaynak

From javadoc of class java.lang.Thread

Bir iş parçacığını bir kereden fazla başlatmak asla yasal değildir. Özellikle, bir   Yürütme tamamlandıktan sonra iş parçacığı yeniden başlatılmayabilir.

See https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#start()

4
katma

Doğrudan Thread kodunu çalıştıramazken, ScheduledExecutorService .

API’dan:

Zamanlama yöntemleri çeşitli gecikmelerle görevler oluşturur ve yürütmeyi iptal etmek veya kontrol etmek için kullanılabilecek bir görev nesnesi döndürür. ScheduleAtFixedRate ve scheduleWithFixedDelay yöntemleri, iptal edilene kadar düzenli olarak çalışan görevleri oluşturur ve yürütür.

Sadece bir iş parçacığıyla bir havuz oluşturabilir, Runnable komutunu verebilir ve her seferinde tekrar çalışmasını isteyebilirsiniz:

public class GetCurrentPrice implements Runnable {
    public void run() {
       //some business logic
    }
}
public class Main {
    public static void main() {
        GetCurrentPrice gcp = new GetCurrentPrice();
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
       //each time thread execution completes, start a new one without delay
        scheduler.scheduleAtFixedRate(gcp, 0, 0, TimeUnit.SECONDS);
    }
}
4
katma

Java'daki konular tekrar kullanılamaz.

İş parçacığını Java'da yeniden başlatmayı denemek yasal değildir.

2
katma

Evet, aynı iş parçacığı bir kereden fazla başlatılamaz, ancak aynı Runnable örneği farklı iş parçacığı nesnelerine geçirilebilir.

More here -> Initializing two threads with the same instance of a runnable

2
katma

İşte iş mantığını tekrarlamanın bir yolu:

public class GetCurrentPrice implements Runnable {
    public void run() {
        businessLogic();
        businessLogic();
    }

    public void businessLogic() {
       //some business logic
    }
}

public class Main {
    public static void main() {
        GetCurrentPrice gcp = new GetCurrentPrice();
        new Thread(gcp).start();
    }
}
0
katma

Hayır, Thread'i bir kereden fazla başlatamazsınız, aynı iş parçacığı başlatmak istediğinizde yeni Runnable'ı başlatmanız gerekir.

0
katma