在Rust中生成阻塞IO的线程似乎是一个常见的习惯用法,因此您可以使用非阻塞通道:
use std::sync::mpsc::channel;
use std::thread;
use std::net::TcpListener;
fn main() {
let (accept_tx, accept_rx) = channel();
let listener_thread = thread::spawn(move || {
let listener = TcpListener::bind(":::0").unwrap();
for client in listener.incoming() {
if let Err(_) = accept_tx.send(client.unwrap()) {
break;
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
问题是,重新加入这样的线程取决于生成的线程"意识到"通道的接收端已经被丢弃(即,调用send(..)返回Err(_)):
drop(accept_rx);
listener_thread.join(); // blocks until listener thread reaches accept_tx.send(..)
Run Code Online (Sandbox Code Playgroud)
你可以为TcpListeners 创建虚拟连接,并TcpStream通过克隆关闭s,但这些似乎是清理这些线程的真正hacky方法,而且就目前而言,我甚至不知道在读取时触发线程阻塞的黑客攻击从stdin加入.
我怎样才能清理这些线程,或者我的架构是错的?
我的项目中有一个用于加载外部资源(即图像和音频文件)的类.该类只有几个成员:用于存储资源的HashMap字段,以及getImage(reference)用于检索资源的方法等.
我最初实现了单例模式,但后来我在链接页面上阅读了一些批评,并考虑使用静态成员.
在愉快地决定静态地实现所有类功能之后很久,我正在做一些代码清理.在这样做时,我意识到没有什么能阻止我实例化这个ResourceManager类.这导致我用abstract关键字标记它.
我以前从未用过abstract这种方式; 我只是传统上为继承树应用它.我尝试使用谷歌搜索和滥用abstract,但我找到的所有资源似乎都不太值得信赖,或者没有建议不要以这种方式使用抽象:
Oracle关于抽象类和方法的教程.
另一个讨论关键字的网站.
从第二个链接引用:"它的目的是纯粹作为类的父级服务."
我的新实施是传统的,可原谅的,还是仅仅是错误的?