サーバーから巨大な画像を取得する必要がありますが、画像が大きすぎるため、サーバーはそれを実行できません。その写真の小さな部分を取得できるように、「座標」を与えることができます。そのため、画像を 100 個のタイルに分割し、10 個のタイルを行に追加し、各行を追加します。順番に行うとうまくいきます。現在、10 個のタイルをダウンロード -> それらを行に追加 -> 次の 10 個のタイルをダウンロード -> 行に追加 -> 2 行目を最初の行に追加 -> 次の 10 個のタイルをダウンロードなど (簡略化):
public static void downloadWholeImage(){
int xcoord=0;
int ycoord=0;
//outer loop for each row
for(int i = 0; i<10; i++){
//all tiles of a row are stored here
BufferedImage[] tilesForRow = new BufferedImage[10];
//inner loop for each tile of a row
for(int j = 0; j<10; j++){
//downloads the image
BufferedImage tile = downloadImage(xcoord,ycoord);
//removes all black pixels of the image
BufferedImage[j] = removeBlackColor(tile);
//increments xcoord so the next tile
xcoord++;
}
//each row gets appended on top of the first row
if(i==0){
BufferedImage firstRow = appendTilesToRow(tilesForRow)
} else{
BufferedImage actualRow = appendTilesToRow(tilesForRow)
}
firstRow = appendActualToFirst(firstRow, actualRow);
//incrementing ycoord for next tile
ycoord++;
}
writeImage(path,firstRow);
}
しかし、行が非常に大きいため、それらを互いに追加するには非常に時間がかかります。それらが追加されている間、他のタイルをダウンロードするスレッドを作成できると思いました。そして、ここに問題があります。私は並行してプログラミングすることに慣れていません。技術的にどのように行われるか (Runnable の実装など) は知っていますが、どのように設計すればよいですか? downloadImage(xcoord, ycoord)
別のスレッドで実行するというアイデアがありましたが、 removeBlackColor(tile)
. また、スレッド内またはスレッドが終了した後?..そして、誰が何を(結合して)待つべきですか? それほど混乱していなかったことを願っています。どこかでさらに説明が必要な場合はお知らせください。