मैंने सोचा कि ThreadPoolExecutor का उपयोग करके हम Runnable
एस को BlockingQueue
में या तो execute
विधि का उपयोग करके निष्पादित करने के लिए सबमिट कर सकते हैं।
इसके अलावा मेरी समझ यह थी कि यदि कोई कार्य उपलब्ध है तो इसे निष्पादित किया जाएगा। बिल्कुलThreadPoolExecutor और queue
public class MyThreadPoolExecutor {
private static ThreadPoolExecutor executor;
public MyThreadPoolExecutor(int min, int max, int idleTime, BlockingQueue<Runnable> queue){
executor = new ThreadPoolExecutor(min, max, 10, TimeUnit.MINUTES, queue);
//executor.prestartAllCoreThreads();
}
public static void main(String[] main){
BlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>();
final String[] names = {"A","B","C","D","E","F"};
for(int i = 0; i < names.length; i++){
final int j = i;
q.add(new Runnable() {
@Override
public void run() {
System.out.println("Hi "+ names[j]);
}
});
}
new MyThreadPoolExecutor(10, 20, 1, q);
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*executor.execute(new Runnable() {
@Override
public void run() {
System.out.println("++++++++++++++");
}
}); */
for(int i = 0; i < 100; i++){
final int j = i;
q.add(new Runnable() {
@Override
public void run() {
System.out.println("Hi "+ j);
}
});
}
}
}
इस कोड को भी नहीं करता है कुछ भी जब तक कि मैं या तो टिप्पणी हटाएं निर्माता में executor.prestartAllCoreThreads();
या मैं runnable की execute
कि प्रिंट System.out.println("++++++++++++++");
(यह भी टिप्पणी की है फोन:
क्या मुझे समझ नहीं आता पीछा कर रहा है बाहर)।
क्यों?
उद्धरण (मेरे जोर):
डिफ़ॉल्ट रूप से, यहां तक कि कोर धागे शुरू में बनाई गई हैं और शुरू कर दिया केवल जब नए कार्य पहुंचें, लेकिन इस गतिशील विधि prestartCoreThread() या prestartAllCoreThreads का उपयोग कर अधिरोहित जा सकता है() । यदि आप एक गैर-खाली कतार के साथ पूल बनाते हैं तो शायद आप थ्रेड को प्रतिष्ठित करना चाहते हैं।
ठीक है। तो मेरी कतार खाली नहीं है। लेकिन मैं executor
बनाता हूं, मैं sleep
करता हूं और फिर मैं कतार में (0 से लूप में) Runnable
एस जोड़ता हूं।
क्या यह लूप new tasks arrive
के रूप में नहीं है?
यह क्यों काम नहीं करता है और मुझे या तो prestart
या स्पष्ट रूप से execute
पर कॉल करना है?
कार्यकर्ता धागे उत्पन्न हुए हैं के रूप में कार्य 'execute' से आया, और इन लोगों कि अंतर्निहित कार्य कतार के साथ बातचीत कर रहे हैं। यदि आप एक खाली खाली कार्य कतार से शुरू करते हैं तो आपको श्रमिकों को प्रतिष्ठित करने की आवश्यकता है। [ओपनजेडीके 7 में कार्यान्वयन] देखें (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/ThreadPoolExecutor.java)। – oldrinb
@veer: हाँ मुझे पता है। लेकिन मैं एक खाली खाली कतार के साथ शुरू करता हूं और फिर कतार में जोड़ना शुरू करता हूं। मुझे श्रमिकों को प्रतिष्ठित करने की आवश्यकता क्यों है? मुझे हर बार कार्यान्वयन की आवश्यकता क्यों है? या तो विनिर्देश गलत है या मैं इसे समझने में असफल रहा हूं। तो यह कौन है? – Cratylus
फिर, मजदूर वे हैं जो सीधे कतार के साथ बातचीत करते हैं। वे केवल 'निष्पादन' (या इसके ऊपर की परतें, जैसे 'invokeAll',' submit', आदि) के माध्यम से पारित होने पर मांग पर उत्पन्न होते हैं। 'Execute' के लिए कोड देखें [यहां] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/concurrent/ThreadPoolExecutor.java#1300)। – oldrinb