Varsayılan olarak, Java akışları varsayılan parametrelerle oluşturulan bir common thread pool tarafından işlenir. another question'da yanıtlandığı gibi, bir özel havuz belirterek veya java.util.concurrent.ForkJoinPool.common.parallelism
sistem parametresini ayarlayarak bu varsayılanları ayarlayabilirsiniz. Ancak, bu iki yöntemden herhangi biriyle akış işlemeye ayrılan iş parçacıklarının sayısını artıramamış bulunmaktayım. Örnek olarak, ilk argümanında belirtilen bir dosyada bulunan IP adreslerinin bir listesini işleyen ve çözümlenen adresleri çıkaran aşağıdaki programı göz önünde bulundurun. Bunu 13000 benzersiz IP adresine sahip bir dosyada çalıştırıyorum, Oracle Java Görev Kontrolü'u 16 iş parçacığı kadar azını kullanarak görüyorum. Bunlardan sadece beşi ForkJoinPool
işçi. Yine de, bu özel görev pek çok iş parçacığından daha iyi yararlanacaktır çünkü iş parçacıkları çoğu zaman DNS yanıtlarını beklerken harcarlar. Yani sorum şu ki, kullanılan iplik sayısını nasıl arttırabilirim?Bir Java akışını varsayılan iş parçacığı sayısıyla nasıl işlerim?
Programı üç ortamda denedim; Bunlar OS tarafından bildirilen iş parçacığı sayısıdır. 17 konu
- Java SE Runtime Environment Windows 7 çalıştıran bir 8 çekirdekli makinesinde 1.8.0_73-B02 oluşturmak Darwin 15.2.0: FreeBSD 11.0 çalıştıran bir 24 çekirdekli makinede 23 ipler
- OpenJDK versiyon 1.8.0_72: 44 konu
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);
}
}
}
Kaynaklarla birlikte tryles with sources deyiminde 'Files.lines()' ifadesini eklemelisiniz! – fge
Paragrafı() kullanmaya başlamadan önce satırları bir Listeye eklemenizi öneririm. Önceden kaç giriş olduğunu bildiğinde çok daha iyi bir iş çıkarır. –