java暂停另一个线程_如何从另一个线程终止或暂停Rust线程?

对于终止和挂起线程,您可以使用通道 .

外部终止

在工作循环的每次迭代中,我们检查是否有人通过渠道通知我们 . 如果是,或者如果通道的另一端超出范围,我们就会打破循环 .

use std::io::{self, BufRead};

use std::sync::mpsc::{self, TryRecvError};

use std::thread;

use std::time::Duration;

fn main() {

println!("Press enter to terminate the child thread");

let (tx, rx) = mpsc::channel();

thread::spawn(move || loop {

println!("Working...");

thread::sleep(Duration::from_millis(500));

match rx.try_recv() {

Ok(_) | Err(TryRecvError::Disconnected) => {

println!("Terminating.");

break;

}

Err(TryRecvError::Empty) => {}

}

});

let mut line = String::new();

let stdin = io::stdin();

let _ = stdin.lock().read_line(&mut line);

let _ = tx.send(());

}

暂停和恢复

我们使用 recv() 暂停线程,直到某些东西到达通道 . 为了恢复该线程,您需要通过该 Channels 发送内容;在这种情况下单位值 () . 如果通道的发送端被丢弃, recv() 将返回 Err(()) - 我们使用它来退出循环 .

use std::io::{self, BufRead};

use std::sync::mpsc;

use std::thread;

use std::time::Duration;

fn main() {

println!("Press enter to wake up the child thread");

let (tx, rx) = mpsc::channel();

thread::spawn(move || loop {

println!("Suspending...");

match rx.recv() {

Ok(_) => {

println!("Working...");

thread::sleep(Duration::from_millis(500));

}

Err(_) => {

println!("Terminating.");

break;

}

}

});

let mut line = String::new();

let stdin = io::stdin();

for _ in 0..4 {

let _ = stdin.lock().read_line(&mut line);

let _ = tx.send(());

}

}

其他工具

Channels 是执行这些任务的最简单,最自然(IMO)的方式,但不是最有效的方法 . 您可以在std::sync模块中找到其他并发原语 . 它们属于比通道更低的级别,但在特定任务中可以更有效 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值