मैं वसंत मल्टीथ्रेडिंग में प्रवेश करने की कोशिश कर रहा हूं और मेरे कुछ प्रश्न हैं।वसंत में मल्टीथ्रेडिंग
मेरे पास थ्रेडरेटिंग क्लास में चलने योग्य विधि है। अब मैं इसका उपयोग करने का सबसे अच्छा तरीका नहीं जानता हूं।
विकल्प 1 मैंने पाया:
private void updateRating() {
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) { // test
// thread part
Runnable worker = new ThreadRating(path, i, products.get(i), dao, fileHandler);
executor.execute(worker);
}
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
log.error("There was an error when ending threads");
System.exit(1);
}
System.out.println("Finished all threads");
}
यह ठीक चल रहा हो लगते हैं। लूप के बाद, यह तब तक इंतजार करता है जब तक धागे खत्म नहीं हो जाते हैं और समाप्त होते हैं।
दूसरा विकल्प मैं
private TaskExecutor taskExecutor;
public UpdateBO(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
private void updateRating() {
for (int i = 0; i < 10; i++) { // test
Runnable worker = new ThreadRating(path, i, products.get(i), dao, fileHandler);
taskExecutor.execute(worker);
}
// wait for threads to be finished before you go any further ??
}
की कोशिश की और xml फ़ाइल में मैं
<beans:bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<beans:property name="corePoolSize" value="5" />
<beans:property name="maxPoolSize" value="10" />
<beans:property name="queueCapacity" value="25" />
<beans:property name="waitForTasksToCompleteOnShutdown" value="true" />
</beans:bean>
<beans:bean id="updateBO" class="UpdateBO">
<beans:constructor-arg ref="taskExecutor" />
</beans:bean>
यहाँ और मेरे सवाल कर रहे हैं:
- कि इन दो विकल्पों के बीच कोई अंतर है ? गति, स्मृति, संभव लीक? या वे वही हैं जो अलग-अलग लिखे गए हैं?
- क्या मुझे webservice का उपयोग करते समय पूल को बंद करने की आवश्यकता है? मुझे पता है कि दूसरे विकल्प में मुझे नहीं करना है, लेकिन यह webservice का उपयोग करते समय भी वही है?
- दूसरे विकल्प का उपयोग करते समय - मुझे तब तक इंतजार करना चाहिए जब तक कि सभी नौकरियां समाप्त नहीं हो जातीं? पहले विकल्प में मैंने पूल को बंद कर दिया और खत्म होने की प्रतीक्षा की। लेकिन दूसरे विकल्प में कार्य पूरा होने से पहले कोड अनुरोध समाप्त हो गया है।
executor.execute(worker);
- बस स्पष्ट करने के लिए। यह वास्तव में एक नया धागा नहीं बना रहा है, लेकिन यह एक कतार में कार्य जोड़ता है और यदि कतार पूर्ण हो जाती है तो यह कोड में इस लाइन पर सही जगह तक पहुंचने तक प्रतीक्षा करता है?
मुझे समझने में मदद के लिए धन्यवाद।
पूल निष्पादकों को बंद करना अच्छा विकल्प नहीं है, कुछ वातावरण जैसे कि सक्षम सर्वर विकल्प के साथ ऐप सर्वर निष्पादक बंद करने का प्रयास सुरक्षा अपवाद का कारण बनता है। यदि आपको श्रमिकों को समाप्त होने तक प्रतीक्षा करने की आवश्यकता है, तो 'रननेबल' के बजाय 'भविष्य' का उपयोग करें। –