Tôi đã làm một số thử nghiệm một năm trước liên quan đến đa lõi với java 7. Đầu tiên tôi thực hiện một số tính toán chỉ trong chủ đề chính (CPU sử dụng cho thấy rằng chỉ có một lõi đã làm tất cả các công việc) và sau đó tôi thực hiện Callable với một ExecutorService dụ. Trong khi chạy tất cả các lõi khi thực hiện công việc.Java 8 tự động sử dụng đa lõi?
Bây giờ, một năm sau, tôi phải triển khai một chút chương trình (sử dụng java 8) để nội suy rất nhiều dữ liệu. Tất cả các công việc được thực hiện trong thread chính (không có Callable và ExecutorService) nhưng khi tôi đang chạy programm, việc sử dụng CPU cho tôi thấy rằng tất cả 4 lõi đều ở mức 98%.
Vì vậy, java 8 tự động phân phối công việc trên tất cả các lõi CPU? Tôi đang bối rối ...
Dưới đây một số mã ...
MapGenerator.java
Region[][] regions = new Region[numOfRegions][numOfRegions];
for(int x = 0; x < regions.length; x++){
for(int z = 0; z < regions[x].length; z++){
newLat = SRTMHandler.getNewLatitude(startLat, z * regionSize * 16);
newLon = SRTMHandler.getNewLongitude(startLon, x * regionSize * 16, newLat);
regions[x][z] = new Region(x, z, regionSize, newLat, newLon);
}
}
Region.java:
private Chunk[] chunks;
public Region(int x, int z, int size, float startLat, float startLon){
this.chunks = new Chunk[this.size][this.size];
//Init stuff
float newLat = this.startLat, newLon = this.startLon;
for(int newX = 0; newX < this.size; newX++){
for(int newZ = 0; newZ < this.size; newZ++){
newLat = SRTMHandler.getNewLatitude(this.startLat, newZ * 16);
newLon = SRTMHandler.getNewLongitude(this.startLon, newX * 16, newLat);
this.chunks[newX][newZ] = new Chunk(this.x * this.size + newX, this.z * this.size + newZ, 16, 900, this, newLat, newLon);
}
}
}
Chunk.java: (SRTMHandler.getHeightForLatLon() thực hiện một số tính toán địa lý và sau đó đọc một giá trị trong mảng byte, không có gì đặc biệt)
public Chunk(int x, int z, int size, int height, Region r, float startLat, float startLon){
this.blocks = new Block[size][size][height];
//Init stuff
try {
this.calcSurface();
//System.out.println("Finished " + this.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void calcSurface() throws IOException{
int x1 = this.x;
int x2 = this.x + 16;
int z1 = this.z;
int z2 = this.z + 16;
final int radius = 45;
float q11 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, (-1)*radius), SRTMHandler.getNewLongitude(this.startLon, (-1)*radius, this.startLat));
float q12 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, radius), SRTMHandler.getNewLongitude(this.startLon, (-1)*radius, this.startLat));
float q21 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, (-1)*radius), SRTMHandler.getNewLongitude(this.startLon, radius, this.startLon));
float q22 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, radius), SRTMHandler.getNewLongitude(this.startLon, radius, this.startLat));
for(int x = 0; x < this.blocks.length; x++){
for(int z = 0; z < this.blocks[x].length; z++){
float height = Interpolation.biLerp(x, z, q11, q12, q21, q22, x1, x2, z1, z2);
this.blocks[x][z][(int)Math.round(height)] = new Block(this.x * this.size + x, this.z * this.size + z, (int)Math.round(height), BlockType.Grass, this);
}
}
}
Bạn có đang sử dụng các tính năng lập trình chức năng của Java 8, cụ thể là các luồng song song không? – erickson
Khi aparapi/parallelforall được cung cấp đầy đủ, thậm chí gpus có thể được sử dụng tự động bằng cách sử dụng mã chỉ java, lambdas. –
Bạn có thể cung cấp một mẫu mã nhỏ không? –