दिलचस्प पोस्ट
PHP के द्वारा जीईटी में उपयोगकर्ता के डेटा को सैनिटिंग करना एंड्रॉइड में, लाइनर लेआउट बच्चों के बीच स्थान कैसे बना सकता है? 2 कॉलम के रूप में कई रिश्ते को एक दिखाएं – 1 अद्वितीय पंक्ति (आईडी और अल्पविराम से अलग सूची) रेल: फॉन्ट अद्भुत का उपयोग करना एन्जोरल 2 में ऑटोसक्रोल jQuery चयनकर्ता मूल्य से बचने JQuery के बिना निकटतम तत्व ढूँढना पायथन एक पीडीएफ फाइल में कई आंकड़े बचाता है एंड्रॉइड संपर्क निष्कर्षण मुझे हल्के बनाम एनोटेट टैग के बारे में क्यों ध्यान रखना चाहिए? विधि हस्ताक्षर में नया कीवर्ड 400 बैड अनुरोध HTTP त्रुटि कोड अर्थ है? 'उपज रिटर्न' का उचित उपयोग ट्विटर बूटस्ट्रैप अनुकूलन सर्वश्रेष्ठ व्यवहार तिथि के अनुसार अर्रे सूची में ऑब्जेक्ट सॉर्ट करें?

कैसे ठीक जावा निष्पादक का उपयोग करने के लिए?

मैंने अपने मल्टी-थ्रेडिंग ऐप्स में जावा निष्पादकों का उपयोग किया है, लेकिन मुझे यह पता नहीं लग सकता है कि निम्नलिखित तरीकों से प्रत्येक का उपयोग करने के लिए सबसे अच्छा कब है:

1।

ExecutorService executor=Executors.newFixedThreadPool(50); executor.execute(new A_Runner(... some parameter ...)); executor.shutdown(); while (!executor.isTerminated()) { Thread.sleep(100); } 

2।

 int Page_Count=200; ExecutorService executor=Executors.newFixedThreadPool(50); doneSignal=new CountDownLatch(Page_Count); for (int i=0;i<Page_Count;i++) executor.execute(new A_Runner(doneSignal, ... some parameter ...)); doneSignal.await(); executor.shutdown(); while (!executor.isTerminated()) { Thread.sleep(100); } 

3।

 int Executor_Count=30; ThreadPoolExecutor executor=new ThreadPoolExecutor(Executor_Count,Executor_Count*2,1,TimeUnit.SECONDS,new LinkedBlockingQueue()); List<Future<String>> futures=new ArrayList<>(3330); for (int i=0;i<50;i++) futures.add(executor.submit(new A_Runner(... some parameter ...)); executor.shutdown(); while (!executor.isTerminated()) { executor.awaitTermination(1,TimeUnit.SECONDS); } for (Future<String> future : futures) { String f=future.get(); // ... } 

विशेष रूप से, [2] में यदि मैंने किए गए सिग्नल को छोड़ दिया है, तो यह [1] की तरह होगा, इसलिए किए गए सिग्नल के लिए उपयोग क्या है?

इसके अलावा, [3] में, क्या होगा अगर मैं एक सिग्नल जोड़ा? या यह संभव है?

मैं क्या जानना चाहता हूं: क्या ये दृष्टिकोण परस्पर विनिमय योग्य हैं, या क्या एक निश्चित स्थिति है जो मुझे ऊपर एक विशिष्ट प्रकार का उपयोग करना है?

Solutions Collecting From Web of "कैसे ठीक जावा निष्पादक का उपयोग करने के लिए?"

  1. ExecutorService

    ExecutorService executor=Executors.newFixedThreadPool(50);

    यह सरल और प्रयोग करने में आसान है। यह ThreadPoolExecutor निम्न स्तर का विवरण छुपाता है

    इस नंबर को प्राथमिकता दें जब Callable/Runnable करने योग्य Callable/Runnable कार्य की संख्या संख्या में छोटी होती है और असीम कतार में कार्यों को जमा करने से स्मृति में वृद्धि नहीं होती है और सिस्टम के निष्पादन को नीचा नहीं करता है यदि आपके पास CPU/Memory बाधाएं हैं, तो कार्यों की RejectedExecutionHandler को संभालने के लिए क्षमता की कमी के साथ ThreadPoolExecutor उपयोग करें और RejectedExecutionHandler

  2. CountDownLatch

    आपने एक गणना की गणना के साथ CountDownLatch को आरम्भ किया है। यह गिनती countDown() विधि के लिए कॉल द्वारा घटाई गई है। मैं मान रहा हूं कि आप अपने रननेबल कार्य में बाद में कमी को बुला रहे हैं। इस गणना को शून्य तक पहुंचने के लिए प्रतीक्षा करने वाले थ्रेड्स await() तरीकों का await() कर सकते हैं कॉलिंग का await() धागा ब्लॉक जब तक गिनती शून्य तक नहीं पहुंचती। यह वर्ग एक जावा धागा सक्षम बनाता है जब तक थ्रेड्स के दूसरे समूह अपने कार्यों को पूरा नहीं कर लेते।

    बक्सों का इस्तेमाल करें:

    1. अधिकतम समांतरता हासिल करना: कभी-कभी हम अधिकतम समानता प्राप्त करने के लिए एक ही समय में कई धागे शुरू करना चाहते हैं

    2. शुरू करने के पहले एन थ्रेड को पूरा करने के लिए प्रतीक्षा करें

    3. गतिरोध का पता लगाने

      अधिक जानकारी के लिए लोकेश गुप्ता द्वारा इस आलेख को देखें।

  3. ThreadPoolExecutor : यह विभिन्न थ्रेड पूल मापदंडों को खत्म करने के लिए अधिक नियंत्रण प्रदान करता है। यदि आपका एप्लिकेशन सक्रिय Runnable/Callable कार्यों की संख्या से विवश है, तो आपको अधिकतम क्षमता सेट करके सीमाबद्ध कतार का उपयोग करना चाहिए। कतार अधिकतम क्षमता तक पहुंचने के बाद, आप RejectionHandler को परिभाषित कर सकते हैं जावा चार प्रकार के RejectedExecutionHandler नीतियों को प्रदान करता है

    1. डिफॉल्ट ThreadPoolExecutor.AbortPolicy , हैंडलर अस्वीकृति पर एक रनटाइम अस्वीकृत ThreadPoolExecutor.AbortPolicy फेंकता है।

    2. ThreadPoolExecutor.CallerRunsPolicy , थ्रेड जो स्वत: निष्पादित करने का आह्वान करता है कार्य चलाता है। यह एक साधारण प्रतिक्रिया नियंत्रण तंत्र प्रदान करता है जो कि नए कार्यों को प्रस्तुत करने की दर को धीमा कर देगा।

    3. ThreadPoolExecutor.DiscardPolicy में। ThreadPoolExecutor.DiscardPolicy , एक कार्य जिसे निष्पादित नहीं किया जा सकता है वह केवल गिरा दिया जाता है।

    4. ThreadPoolExecutor.DiscardOldestPolicy , यदि निष्पादक बंद नहीं है, काम कतार के शीर्ष पर कार्य को हटा दिया गया है, और फिर निष्पादन पुनः प्रयास किया गया है (जो फिर से विफल हो सकता है, जिससे इसे दोहराया जा सकता है।)

      यदि आप CountDownLatch व्यवहार को अनुकरण करना चाहते हैं, तो आप invokeAll() विधि का उपयोग कर सकते हैं।

  4. एक और तंत्र जिसे आपने उद्धरण नहीं दिया है ForkJoinPool

    ForkJoinPool Java 7 में जावा में जोड़ा गया था। ForkJoinPool जावा ExecutorService समान है लेकिन एक अंतर के साथ। ForkJoinPool कार्यों के लिए अपने कार्यों को छोटे कार्यों में विभाजित करने के लिए आसान बनाता है जो फिर ForkJoinPool भी सबमिट किए ForkJoinPool हैं। जब कार्यकर्ता थ्रेड्स व्यस्त कार्यकर्ता थ्रेड कतार से कार्य चोरी करते हैं, तो टास्क स्टिलिंग ForkJoinPool में होता है।

    जावा 8 ने एक्ज़ीक्यूटर्स सेवा में एक और एपीआई पेश किया है जो काम के लिए चोरी का पूल तैयार कर रहा है। आपको RecursiveAction ForkJoinPool और RecursiveAction ForkJoinPool बनाने की ज़रूरत नहीं है लेकिन फिर भी ForkJoinPool उपयोग कर सकते हैं

      public static ExecutorService newWorkStealingPool() 

    सभी उपलब्ध प्रोसेसरों का उपयोग करके एक काम-चोरी थ्रेड पूल बनाता है क्योंकि इसका लक्ष्य समानांतरवाद स्तर है।

    डिफ़ॉल्ट रूप से, यह पैरामीटर के रूप में CPU कोर की संख्या लेगा

ये सभी चार तंत्र एक-दूसरे के लिए मानार्थ हैं ग्रैन्यूलिटी के स्तर के आधार पर आप नियंत्रित करना चाहते हैं, आपको सही लोगों को चुना जाना चाहिए