const startTime = (new Date).getTime()
const todo=(ms)=>{
return new Promise((res,rej)=>{
setTimeout(()=>{
res()
},ms)
})
}
class SuperTask {
constructor(parallelCount){
// 并发数量
this.parallelCount = parallelCount
// 排号队列
this.queue = []
// 办理队列
this.exec_queue = []
}
add(todoFn){
return new Promise((res,rej)=>{
this.queue.push({
todoFn,
res,
rej
})
this.exec()
})
}
exec(){
if(this.exec_queue.length<this.parallelCount&&this.queue.length){
const execItem = this.queue.shift()
this.exec_queue.push(execItem)
const {todoFn,res} = execItem
return todoFn().finally(()=>{
// 异步执行好了
res()
// 任务数减一
this.exec_queue.shift()
// 下一位
this.exec()
})
}
}
}
const superTask = new SuperTask(2)
const addTask=(name,ms)=>{
superTask
.add(()=>todo(ms))
.then(()=>{
console.log(`${Number(((new Date).getTime()-startTime)/1000).toFixed()} 秒后,任务${name}完成`)
})
}
// 2线程
addTask("1",2000) // 2秒后,打印
addTask("2",1000) // 1秒后,打印
addTask("3",5000) // 6秒后,打印
addTask("4",2000) // 4秒后,打印
addTask("5",1000) // 5秒后,打印
// 3线程
addTask("1",2000) // 2秒后,打印
addTask("2",1000) // 1秒后,打印
addTask("3",5000) // 5秒后,打印
addTask("4",2000) // 3秒后,打印
addTask("5",1000) // 3秒后,打印
用原生 js 模拟多线程运行
最新推荐文章于 2024-04-03 05:49:40 发布