/ एक जावा थ्रेडपूल में फ़ंक्शन रद्द करें - पूल में विशिष्ट रन करने योग्य का पता लगाएं और इसे रद्द करें - जावा, एंड्रॉइड, मल्टीथ्रेडिंग, थ्रेडपूल, थ्रेडप्लोलेक्सस

एक जावा थ्रेडपूल में फ़ंक्शन रद्द करें - पूल में विशिष्ट रननेबल का पता लगाएं और इसे रद्द करें - जावा, एंड्रॉइड, मल्टीथ्रेडिंग, थ्रेडपूल, थ्रेडपोलेक्सएटर

मेरे पास मेरे एंड्रॉइड एप्लिकेशन में थ्रेडपूल है जहां मैं अलग-अलग स्थिति में थ्रेड्स का एक गुच्छा चलाता हूं।

public class ThreadPoolExecuter {

private final ExecutorService mExecuter;
private static final int nThreads = 5;

private ThreadPoolExecuter() {
this.mExecuter = Executors.newFixedThreadPool(nThreads);
}

जावा थ्रेडपूल में थ्रेड को रद्द करने के लिए कोई डिफ़ॉल्ट नहीं है। एक उपाय जिसके बारे में मैंने सोचा था कि मैं भविष्य में एक महत्वपूर्ण मूल्य जोड़े रख रहा था, जब मैं रन करने योग्य प्रस्तुत करता हूं।

public void add(Runnable runnable) {
Future<?> future = this.mExecuter.submit(runnable);
// Add future to my key-value pairs
if(Constant.DEBUG) Log.d(TAG, "Task submitted.");
}

और फिर एक रद्द समारोह है:

public boolean cancel(KEY) {
Future<?> future = map.get(KEY)
return future.cancel(mayInterruptIfRunning);
}

मान लीजिए कि हमशॉफ़ कहते हैं। मूल्य भविष्य है, कुंजी के बारे में क्या है? 1) आपका सुझाव क्या है?

Map<Key, Future<?>> map = new HashMap()<key, Future<?>>;

इस कुंजी के बारे में मैंने सोचा कि प्रत्येक runnable के लिए एक आईडी पारित करने के बारे में निम्नानुसार है:

2) आप इस समाधान के बारे में क्या सोचते हैं?

लेकिन मैं इस बात का उल्लेख करूंगा कि कभी-कभी मेरी रूमानी कक्षा में मुझे इंटरप्टेड एक्ससेप्शन का सामना करना पड़ता था। क्या इससे बचने का कोई उपाय है?

class Runner implements Runnable {

private int id;

public Runner(int id) {
this.id = id;
}

@Override
public void run() {

System.out.println("Starting " + id);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
System.out.println("Crashed on:" + Thread.currentThread().getId());
}
System.out.println("ending " + id);
}
}

3) आखिर में मैं जोड़ना चाहता हूं कि आपके लिए जावा थ्रेडपूल में एक रद्द फ़ंक्शन विकसित करने के लिए आपके दृष्टिकोण में किसी भी बेहतर समाधान को जानना महत्वपूर्ण है?

ध्यान दें कि मैं अपने थ्रेडपूल के लिए प्रतिस्थापन की तलाश नहीं करता हूं, जैसे कि एंड्रॉइड में AsyncTask जो डिफ़ॉल्ट रद्दीकरण है।

उत्तर:

उत्तर № 1 के लिए 1

चूंकि आपकी प्राथमिक आवश्यकता एक बार में सभी चल रहे कार्यों को रद्द करने में सक्षम होने के लिए है, जिसका आपको उपयोग करने में सक्षम होना चाहिए shutdownNow() का ExecutorService। चूक ExecutorService कार्यान्वयन बुलाएंगे Thread.interrupt() ताकि आप को संभालना चाहिए चल रहे धागे को खत्म करने के लिए InterrputedException ठीक से (उपयोग किए गए और बाहर निकलने वाले किसी भी संसाधन को बंद करके)।


जवाब के लिए 0 № 2

आम तौर पर बाहर से धागे को रद्द करनाथ्रेड में सभी प्रकार के जोखिम होते हैं जो पहले "स्पष्ट नहीं होते हैं। एक सुरक्षित दृष्टिकोण के लिए थ्रेड होता है जब यह देखने के लिए जांच शुरू होता है कि क्या इसे अभी भी चलाने की आवश्यकता है।"