'u kullanarak çok uzun süren görevleri nasıl iptal edebilirim 2 parçacığı FixedThreadPool ExecutorService adlı bir CompletionService kullanılarak tamamlanmış bazı Gelecekteki görevler sunarım, daha sonra verilen görevlerin sayısına eşit bir döngü ayarlayın ve tamamlama hizmetini kullanın. Hepsini() tamamlamaları veya bitirmelerini beklemek. Sorun çok nadiren bitmez (ama nedenini bilmiyorum) bu yüzden take() yöntemini bir ankete dönüştürdüm (300, Timeout.SECONDS), bu fikir bir görevi tamamlamak için 5 dakikadan uzun sürüyorsa anket başarısız olur ve daha sonra döngüden çıkacaktır ve tüm gelecekleri gözden geçirebilirim ve hatalı görevi iptal etmeyi zorlamak için future.cancel'i (doğru) arayabilirim.CompletionService
Ancak kodu çalıştırdığımda ve kilitlendiğinde, yoklamanın her 5 dakikada bir başarısız olduğunu görüyorum ve artık hiçbir görev çalışmıyor, bu yüzden iki işçinin bir şekilde kilitlendiğini ve hiçbir zaman bitmeyeceğini ve hiçbir zaman ek görevlere izin vermediğini varsayıyorum başlamak. Zaman aşımı 5 dakika olduğu için hala 1000 görev vardı ve bu süre sonunda devre dışı bırakmak için alınan sürenin çok uzun olması nedeniyle işi iptal etti.
Yapmak istediğim şey, 5 dakika içinde tamamlanmamışsa geçerli görevi geçici olarak zorla iptal etmekti, ancak bunu yapmanın bir yolunu göremiyorum.
Bu kod örneği Im, sizin Callable kesintiyi destekleyen bir çağrı engelleyen yaklaşık
import com.jthink.jaikoz.exception.JaikozException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.*;
public class CompletionServiceTest
{
public static void main(final String[] args)
{
CompletionService<Boolean> cs = new ExecutorCompletionService<Boolean>(Executors.newFixedThreadPool(2));
Collection<Worker> tasks = new ArrayList<Worker>(10);
tasks.add(new Worker(1));
tasks.add(new Worker(2));
tasks.add(new Worker(3));
tasks.add(new Worker(4));
tasks.add(new Worker(5));
tasks.add(new Worker(6));
List<Future<Boolean>> futures = new ArrayList<Future<Boolean>>(tasks.size());
try
{
for (Callable task : tasks)
{
futures.add(cs.submit(task));
}
for (int t = 0; t < futures.size(); t++)
{
Future<Boolean> result = cs.poll(10, TimeUnit.SECONDS);
if(result==null)
{
System.out.println("Worker TimedOut:");
continue;
}
else
{
try
{
if(result.isDone() && result.get())
{
System.out.println("Worker Completed:");
}
else
{
System.out.println("Worker Failed");
}
}
catch (ExecutionException ee)
{
ee.printStackTrace();
}
}
}
}
catch (InterruptedException ie)
{
}
finally
{
//Cancel by interrupting any existing tasks currently running in Executor Service
for (Future<Boolean> f : futures)
{
f.cancel(true);
}
}
System.out.println("Done");
}
}
class Worker implements Callable<Boolean>
{
private int number;
public Worker(int number)
{
this.number=number;
}
public Boolean call()
{
if(number==3)
{
try
{
Thread.sleep(50000);
}
catch(InterruptedException tie)
{
}
}
return true;
}
}
çıkışı da işçi örnekte
Worker Completed:
Worker Completed:
Worker Completed:
Worker Completed:
Worker Completed:
Worker TimedOut:
Done
@ user294896 - Küçük, kendi kendine yeten bir örnekte bazı örnek kodlar sağlayabilir misiniz? – justkt
@justkt Denebilirim, biraz zaman alabilir –
Neden görev çok uzun sürüyor ve iptal edemiyor? Bu, işleri büyük ölçüde basitleştirebilir. – trojanfoe