डिफ़ॉल्ट रूप से जावा स्ट्रीम को common thread pool द्वारा संसाधित किया जाता है, जो डिफ़ॉल्ट पैरामीटर के साथ बनाया गया है। जैसा कि another question में उत्तर दिया गया है, कोई कस्टम पूल निर्दिष्ट करके या java.util.concurrent.ForkJoinPool.common.parallelism
सिस्टम पैरामीटर सेट करके इन डिफ़ॉल्ट को समायोजित कर सकता है।मैं जावा स्ट्रीम को थ्रेड की डिफ़ॉल्ट संख्या से अधिक कैसे संसाधित कर सकता हूं?
हालांकि, मैं इन दो विधियों में से किसी एक द्वारा प्रसंस्करण स्ट्रीम करने के लिए आवंटित धागे की संख्या में वृद्धि करने में असमर्थ रहा हूं। उदाहरण के तौर पर, नीचे दिए गए कार्यक्रम पर विचार करें, जो उसके पहले तर्क में निर्दिष्ट फ़ाइल में निहित आईपी पते की एक सूची को संसाधित करता है और हल किए गए पते को आउटपुट करता है। लगभग 13000 अद्वितीय आईपी पते वाले फ़ाइल पर इसे चलाना, मैं ओरेकल जावा मिशन कंट्रोल का उपयोग 16 धागे के रूप में देख रहा हूं। इनमें से केवल पांच ही ForkJoinPool
कर्मचारी हैं। फिर भी, यह विशेष कार्य कई और धागे से लाभान्वित होगा, क्योंकि थ्रेड अधिकांश समय DNS प्रतिक्रियाओं के लिए प्रतीक्षा करते हैं। तो मेरा सवाल यह है कि, मैं वास्तव में इस्तेमाल किए गए धागे की संख्या कैसे बढ़ा सकता हूं?
मैंने तीन वातावरण पर कार्यक्रम की कोशिश की है; ये ओएस-रिपोर्ट की संख्या धागे हैं। 17 धागे
- जावा SE रनटाइम वातावरण एक 8 कोर विंडोज 7 चल मशीन पर 1.8.0_73-B02 का निर्माण डार्विन 15.2.0: 23 धागे
- openjdk संस्करण 1.8.0_72 एक 24 कोर FreeBSD 11.0 चल मशीन पर: 44 धागे
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.file.Files;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.ForkJoinPool;
/** Resolve IP addresses in file args[0] using 100 threads */
public class Resolve100 {
/** Resolve the passed IP address into a name */
static String addressName(String ipAddress) {
try {
return InetAddress.getByName(ipAddress).getHostName();
} catch (UnknownHostException e) {
return ipAddress;
}
}
public static void main(String[] args) {
Path path = Paths.get(args[0]);
ForkJoinPool fjp = new ForkJoinPool(100);
try {
fjp.submit(() -> {
try {
Files.lines(path)
.parallel()
.map(line -> addressName(line))
.forEach(System.out::println);
} catch (IOException e) {
System.err.println("Failed: " + e);
}
}).get();
} catch (Exception e) {
System.err.println("Failed: " + e);
}
}
}
आपको कोशिश-संसाधन-संसाधन विवरण में 'Files.lines() 'संलग्न करना चाहिए! – fge
मेरा सुझाव है कि आप समांतर() इसे करने का प्रयास करने से पहले सूची में लाइनें जोड़ें। यह बहुत बेहतर काम करता है जब यह जानता है कि अग्रिम में कितनी प्रविष्टियां हैं। –