# Multi Progress
`MultiProgress` owns a single renderer and stores bars in draw order. Child bars are
updated through their normal `ProgressBar` handles, and `join` refreshes the block until
every bar is finished or abandoned.
## Thread Safety
`ProgressBar` and `MultiProgress` use `Arc<Mutex<_>>` internally. Cloning either handle
shares the same state, which makes them suitable for worker threads.
```rust
use loaders::{MultiProgress, ProgressBar};
use std::thread;
let multi = MultiProgress::new();
let pb = multi.add(ProgressBar::new(10));
pb.inc(1);
}
pb.finish();
});
multi.join();
let _ = handle.join();
```
## Ordering
Use `add` to append, `insert` for an index, `insert_before` and `insert_after` for relative
placement, and `remove` when a bar should leave the block.
## Messages Above the Block
`multi.println("message")` prints without corrupting the progress area. It is useful for
phase names, warnings, and completed file names.
## Best Practices
Create the `MultiProgress` on the main thread, add bars before spawning workers, clone or
move each returned `ProgressBar` into the worker, and call `join` from the thread that owns
the terminal.