Rust スレッドの生成と合流 spawn, join
概要
- 複数の処理を並行して実行するにはスレッドを生成する。
- スレッドを生成するには「spawn」を使う。
- スレッドの終了を待つには「join」を使う。
- 処理をある時間だけ停止させるには「sleep」を使う。
プログラム例
- 別スレッドで0.5秒間隔で5回「▲」と表示する。
- 本スレッドで0.3秒間隔で5回「○」と表示する。
use std::thread::{spawn, sleep}; use std::time::{Duration}; fn main() { let 別スレッド = spawn(|| { for i in 1..=5 { sleep(Duration::from_millis(500)); println!("▲ {:.1}", (i as f64) * 0.5); } }); for i in 1..=5 { sleep(Duration::from_millis(300)); println!("○ {:.1}", (i as f64) * 0.3); } 別スレッド.join().unwrap(); }
結果
- 1.5のところは、ほぼ同時に実行されているので、前後することがある。
○ 0.3 ▲ 0.5 ○ 0.6 ○ 0.9 ▲ 1.0 ○ 1.2 ▲ 1.5 ○ 1.5 ▲ 2.0 ▲ 2.5
解説
use std::thread::{spawn, sleep}; use std::time::{Duration}; fn main() { let 別スレッド = spawn(|| { // └ 以下のような処理のスレッドを生成し実行する。 for i in 1..=5 { sleep(Duration::from_millis(500)); // └ 500ミリ秒、停止する。 println!("▲ {:.1}", (i as f64) * 0.5); // └ {:.1} ◁小数点以下1桁表示する。 // └ i as f64 ◁整数を実数に変換する。実数同士は計算できる。 } }); for i in 1..=5 { sleep(Duration::from_millis(300)); println!("○ {:.1}", (i as f64) * 0.3); } 別スレッド.join().unwrap(); // └ 別スレッドが終了するまで待機する。 }