नीचे दिए गए कोड में, मैं इरादे के अनुसार 100 सेकंड के बाद टाइमआउट अपवाद पकड़ रहा हूं। इस बिंदु पर मैं कोड से मुख्य से बाहर निकलने की उम्मीद करता हूं और कार्यक्रम समाप्त हो जाता है लेकिन यह कंसोल पर प्रिंटिंग रखता है। टाइमआउट के बाद निष्पादन को रोकने के लिए मैं कार्य कैसे प्राप्त करूं?टाइमआउट अपवाद के बाद वापस आने के लिए मैं फ़्यूचरटास्क कैसे प्राप्त करूं?
private static final ExecutorService THREAD_POOL = Executors.newCachedThreadPool();
private static <T> T timedCall(Callable<T> c, long timeout, TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
FutureTask<T> task = new FutureTask<T>(c);
THREAD_POOL.execute(task);
return task.get(timeout, timeUnit);
}
public static void main(String[] args) {
try {
int returnCode = timedCall(new Callable<Integer>() {
public Integer call() throws Exception {
for (int i=0; i < 1000000; i++) {
System.out.println(new java.util.Date());
Thread.sleep(1000);
}
return 0;
}
}, 100, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
! Task.cancelled() होना चाहिए! IsCancelled() djna के रूप में मूल रूप से – Zed
लिखा है, मुझे लगता है कि बाधाओं का उपयोग करना बेहतर है। सबसे पहले, आपके कॉल करने योग्य कोड को 'कार्य' के बारे में जानने की आवश्यकता नहीं है। दूसरा, जब आप अपने कॉल करने योग्य कोड (जैसे 'थ्रेड.sleep()') में विभिन्न अवरुद्ध संचालन का उपयोग कर रहे हैं, तो यह task.isCancelled() पर प्रतिक्रिया नहीं करेगा, लेकिन आमतौर पर बाधाओं पर प्रतिक्रिया करता है। तो 'रद्द करें (सत्य)' का उपयोग करके और आपके कोड को बाधाओं के बारे में जागरूक करना आमतौर पर ऐसा करने का सबसे अच्छा तरीका है। (आपका कोड और भी सामान्य होगा, क्योंकि जावा में व्यवधान तंत्र का व्यापक रूप से उपयोग किया जाता है) –
मुझे लगता है कि मेरा मुद्दा यह है कि "व्यवधान एक सहकारी तंत्र है।" (http://www.ibm.com/developerworks/java/library/j-jtp05236.html) –