java_threadpool/ThreadPool_rs/
mod.rsuse std::cell::RefCell;
use std::sync::mpsc::{Receiver, SyncSender};
use std::sync::{mpsc, Arc, LazyLock, Mutex};
mod Executor_rs;
mod Message_rs;
pub mod Future_rs;
use Executor_rs::Executor;
use Message_rs::Message;
use Future_rs::Future;
static mut CORS_THREAD: LazyLock<Mutex<RefCell<usize>>> = std::sync::LazyLock::new(|| {
return Mutex::new(RefCell::new(0));
}
);
pub struct ThreadPool {
sync_sender: SyncSender<Message>,
arc_mutex_receiver: Arc<Mutex<Receiver<Message>>>,
core_pool_size: usize,
maximum_pool_size: usize,
keep_alive_time: usize,
}
type Job = Box<dyn Fn() + Send + 'static>;
impl ThreadPool {
pub fn new(core_pool_size: usize, maximum_pool_size: usize, keep_alive_time: usize) -> Self {
let (sync_sender, receiver) = mpsc::sync_channel::<Message>(keep_alive_time);
let arc_mutex_receiver = Arc::new(Mutex::new(receiver));
for _ in 0..core_pool_size {
let clone_receiver = Arc::clone(&arc_mutex_receiver);
Executor::new(clone_receiver);
}
return ThreadPool {
sync_sender: sync_sender,
arc_mutex_receiver: arc_mutex_receiver,
core_pool_size: core_pool_size,
maximum_pool_size: maximum_pool_size,
keep_alive_time: keep_alive_time,
};
}
pub fn executor<F>(&self, closure: F) -> Future
where
F: Fn() + Send + 'static,
{
unsafe {
let lock = (*CORS_THREAD).lock().unwrap();
let mut thread_size = lock.borrow_mut();
let (sender, receiver) = mpsc::channel::<String>();
self.sync_sender.send(Message::Mess_job((Box::new(closure), sender))).unwrap();
let future = Future {receiver:receiver};
*thread_size = (*thread_size) + 1;
if (*thread_size) >= self.core_pool_size && (*thread_size) <= self.maximum_pool_size {
Executor::new_thread(Arc::clone(&self.arc_mutex_receiver));
*thread_size = (*thread_size) + 1;
}
return future;
}
}
}
impl Drop for ThreadPool {
fn drop(&mut self) {}
}