रद्द करने के तरीके को कैसे संभालें पर सबमिट किए गए कार्यों के निष्पादन को ट्रैक करने के लिए कॉलबैक प्रदान करने के लिए मैंने java.util.concurrent
से FutureTask
बढ़ाया है।फ्यूचरटास्क का विस्तार,
public class StatusTask<V> extends FutureTask<V> {
private final ITaskStatusHandler<V> statusHandler;
public StatusTask(Callable<V> callable, ITaskStatusHandler<V> statusHandler){
super(callable);
if (statusHandler == null)
throw new NullPointerException("statusHandler cannot be null");
this.statusHandler = statusHandler;
statusHandler.TaskCreated(this);
}
@Override
public void run() {
statusHandler.TaskRunning(this);
super.run();
}
@Override
protected void done() {
super.done();
statusHandler.TaskCompleted(this);
}
}
अब, मैं क्या देखते हैं अगर काम प्रस्तुत किया जाता है, लेकिन पंक्तिबद्ध समाप्त होता है और मैं काम cancel(true);
- run()
पद्धति अभी भी बुलाया जाता है - और FutureTask.run()
(संभावना) की जाँच करता है कि कार्य को रद्द कर दिया और नहीं करता है लपेटा कॉल करने योग्य कॉल नहीं है।
क्या मुझे ऐसा करना चाहिए
@Override
public void run() {
if(!isCancelled()) {
statusHandler.TaskRunning(this);
super.run();
}
}
या मुझे अभी भी super.run()
पर कॉल करना चाहिए? इन दोनों दृष्टिकोणों को रद्दीकरण की जांच और इसके बारे में कुछ करने के बीच दौड़ की स्थिति के लिए अतिसंवेदनशील लगता है .. किसी भी विचार की सराहना की।
मुझे लगता है कि अंतिम खंड में कॉल स्थिति होना चाहिए हैंडलर। कार्य पूर्ण (यह); क्या कोई ऐसा मामला है जहां रन विधि नहीं कहा जाएगा लेकिन किया गया() विधि होगी? – nos
गलती को पकड़ने के लिए धन्यवाद। मैंने अंत में ब्लॉक में कॉल तय की। हां, यह संभव है कि किया गया() को रन() के बिना बुलाया जा सकता है। फ्यूचरटास्क # सिंक # आंतरिक कैंसल (बूलियन) देखें। वहां, बशर्ते कि कार्य चलाना समाप्त नहीं हुआ है, जिसमें यह भी शुरू नहीं हो रहा है, आप देख सकते हैं कि किया गया() कहा जाएगा। ध्यान दें कि() को किसी भी भविष्य के लिए शून्य या एक बार कहा जाएगा: शून्य अगर न तो चलाएं() न ही रद्द करें() को कभी-कभी नहीं कहा जाता है। – seh
हालांकि, यदि आप इसे निष्पादित करने वाले निष्पादक को सबमिट करते हैं() को कॉल किया जाएगा, तो उसे निष्पादित करने से पहले कार्य रद्द कर दिया जाएगा - हालांकि निष्पादक को इसके बारे में पता नहीं है। निष्पादक केवल रननेबल/कॉलबेल के बारे में जानता है। तो, रन() को तब कॉल किया जाएगा जब अंततः उस मामले में रननेबल हो जाता है FutureTask # run() अनिवार्य रूप से कुछ भी नहीं करता है। – nos