SORU
16 ŞUBAT 2010, Salı


Nasıl bir iş zaman aşımı için

Zaman sabit bir miktar için bir iş parçacığı çalıştırmak istiyorum. Eğer bu süre içinde tamamlanmış değilse, onu öldürmek, bazı özel durum ya da bir şekilde halletmek istiyorum. Nasıl yapılabilir?

*11 benim de tahmin ettiğim gibi yapmanın bir yolu* çalışma içinde bir TimerTask kullanmaktır() İplik yöntemi.

Daha iyi bunun için çözümler var mı?


EDİT: daha net bir cevaba ihtiyacım vardı. bir kelle Ekleme ExecutorService aşağıda verilen kod sorunumu gidermez. Neden uyumalıyım() yürütme (kodu - bu kod parçası üzerinde bir tanıtıcı yok) sonra? Kod tamamlandıktan ve uyku halinde) kesildi, bu nasıl bir zaman aşımı olabilir mi?

İdam edilmesi gereken bu görev benim kontrolümde değil. Kod herhangi bir parça olabilir. Sorun bu kod parçası sonsuz bir döngü içine çalışabilir. Bunun olmasını istemiyorum. Yani ben ayrı bir iş parçacığı bu görevi çalıştırmak istiyor. Üst iplik iş parçacığı bitirene kadar beklemek zorundadır ve bu görev (i.durumunu bilmesi gerekir e olsun o zaman veya bazı özel durum ya da bir başarı) oluştu. Eğer görevi sonsuz bir döngüye gider, benim ana iş parçacığı ideal bir durum değil ki sonsuza kadar bekleyen tutar.

CEVAP
16 ŞUBAT 2010, Salı


ExecutorService yerine Timer, SSCCE: kullanımı gerçekten çok

package com.stackoverflow.q2275443;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Test {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(4000); // Just to demo a long running task of 4 seconds.
        return "Ready!";
    }
}

Future#get() yöntem timeout bağımsız değişken, örneğin 5 artış ile biraz oynamak ve iplik bitirir görürsünüz. catch (TimeoutException e) bloğundaki zaman aşımı müdahale.

Güncelleme:yanlış anlama, sleep() bir kavramsal açıklık sağlamaktırdeğilgerekli. Sadece SSCCE/gösteri amaçlı kullanılır. Yapseninsleep() orada bir yerde uzun süre çalışan görev. Uzun süren görev içinde, eğer konu şöyle: interrupted olup olmadığını kontrol etmelisiniz

while (!Thread.interrupted()) {
    // Do your long running task here.
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Louis C.K.

    Louis C.K.

    18 HAZİRAN 2006
  • PhoneArena

    PhoneArena

    7 NİSAN 2006
  • ThreadBanger

    ThreadBanger

    2 Mart 2007