By this, I mean like //set in WorldEdit. It's clear that plainly adding setBlock in nested loops is not a good practice. Of course, I already had a look at source codes of BuilderTools, MyPlot, etc, but I still don't get the logic behind it. I'd appreciate it if someone can explain the basic idea of it.
What most people do is executing this type of actions asynchronous, so they get the Chunk from the ChunkManager ( I think it was the Chunk ), and work with this, as the Chunk is serializable, worlds are not. Then the blocks are asynchronously changed in the Chunk, and the chunk is being injected into the World in onComplete()
BuilderTools never used AsyncTask for fillig areas. Filling is slow because of PocketMine sends packet after every change (that's the Level->setBlock() function). BuilderTools sends packet with whole the chunk which is edited by SubChunkIteratorManager.
Yea I said most people, I use Async for that for example. But your Idea of how to do it is also really good, might have a look into that myself