(1)
iyi çözüm zaman aşımı ile verilerinizi göndermektir. Bu uygulanabilir değilse, böyle bir yapılandırma göstermiyor kullandığınız API, ikinci en iyi çözüm interruptible API kullanmak olacaktır çünkü
try {
mySendingDataLibraryApi.sendData(data, timeout /*, timeUnit */);
// some new APIs enable also to configure the time unit of the required timeout.
// Older APIs typically just use milliseconds.
} catch (TimeoutException e) {
doCleanup(); // your cleanup method.
}
(2)
gibi görünmelidir sendData
yöntemini yürütür ve yürütme iş parçacığını kesintiye uğratır. Bu, böyle bir kesintili API'nın sağlanmasına dayanır.
class MySendingDataRunnable implements Runnable {
@Override
public void run() {
try {
mySendingDataLibraryApi.sendDataInterruptibly(data);
} catch (InterruptedException e) {
doCleanup(); // your cleanup method.
// here either re-throw InterruptedExecption
// or restore the interrupted state with Thread.currentThread().interrupt();
}
}
}
The: zamanlanmış yöntem API tarafından sağlanan değilse böyle bir yöntemin varlığına pek saymak olmaz ... Neyse, görevi yürütür dizisindeki kod gibi görünecektir
final ExecutorService executor = Executors.newSingleThreadExecutor();
final Future<?> future = executor.submit(new MySendingDataRunnable());
try {
final Object noResult = future.get(60, TimeUnit.SECONDS); // no result for Runnable
} catch (InterruptedException e) {
// here again either re-throw or restore interupted state
} catch (ExecutionException e) {
// some applicative exception has occurred and should be handled
} catch (TimeoutException e) {
future.cancel(true); // *** here you actually cancel the task after time is out
}
(3: arayan kod iplik true
ayarlanmış mayInterruptIfRunning
bağımsız değişken ile görev istenilen bekleme süresi ve iptal etmek için, onun Future<?> submit(Runnable task)
yöntemi tarafından döndürülen bir ExecutorService ve Future örneği kullanmak gerekir)
Kullandığınız API bu özelliklerden hiçbirini sağlamazsa (zamanlanmış/kesintili yöntemler), yaratıcılığınızı kullanmanız gerekir! Bu bir satırlık kod satırınız, numaralı kaynakta kodunu engelliyor olmalıdır. Bu kaynağa erişmeye çalışın ve kapatıp kapatmaya çalışın.Tipik bir örnek ağ bağlantısını kapatıyor.
Not: Yukarıdaki çözümler yalnızca gerçekten görevi iptal ve daha fazla görevler için iplik kurtararak bir yol sağlar. Ancak iş parçacığı hala yaşıyor olabilir. İş parçacığının öldürülmesi genellikle bir görev tamamlandığında (veya bu konuda başarısız olduğunda) yaptığınız bir şey değildir. Bir kez daha gerçekleştirilmemesi gereken belirli görevler için bazı thread (ler) oluşturduğunuzda kabul edilebilir. Bu gibi durumlarda, yukarıdaki ExecutorService
'u kullanır ve shutdownNow()
yöntemini çağırırsınız. Ve hatta shutdownNow()
sadece en iyi çabayı ve tipik kesintisiz olarak fiili görev bağlıdır ...
Here's a detailed article (yine biraz eski ama).
Bu iş parçacığında en üst düzey bir döngü var mı? İplik sıkışmış olsa bile tekrar tekrar ulaşılan bir kod parçası var mı? İş parçacığı çalışmaya başlamadan önce kaç kez döngü/yineleme olacağını tahmin edebilir misiniz? –
İdeal olarak, iş parçanızın periyodik olarak kontrol ettiği bir işaretiniz olmalıdır. Bayrak ayarlanmışsa, iş parçacığınız, görevinin düzenli olarak kapatılmasını sağlamalıdır. – Aurand
Döngü veya başka bir şey yoktur. İş parçacığı veri gönderiyor, ancak veri göndermek için çok uzun sürüyorsa kapatılmasını istiyorum. Bir kod satırında sıkışmışsa, periyodik olarak nasıl kontrol edebilirim? – user760220