菜单

循序渐进

    Java Oracle MySQL Bash Python Nginx Apache Redis MongoDB Git HTML Javascript Node CSS

最近来访

    javascript进阶.多线程

    张嘉杰.原创 2013-04-06 javascript

    今儿下班路上,以前的一位同事电话问起javascript是否可以多线程(项目中碰到多个倒计时秒杀),首先可以肯定的是html5之前,浏览器端的javascript一定是单线程的。今天这里先不讨论html5之后的多线程问题。

    javascript 模拟实现多线程的方案

    1. command模式
    2. setTimeout函数
    3. setInterval函数

    封装了一个简单的模拟多线程函数

    // 模拟多线程函数
    function Thread(_task, _delay, _times){
        this.runFlag = false; // 执行标识
        this.busyFlag = false; // 恢复标识
        this.taskArgs = Array.prototype.slice.call(arguments, 3);
        
        if (_times != undefined) {
            this.times = _times;
        } else { 
            this.times = 1;
        }
        
        var _point = this;
        
        this.timerID = -1; // 定时器内部标识
        
        // 开始函数
        this.start = function(){
            if (this.runFlag == false) {
                this.timerID = window.setInterval(_point.run, _delay);
                this.runFlag = true;
            }
        }
        
        // 执行函数
        this.run = function(){
            if (_point.busyFlag) 
                return;
            if (_point.times == -1)// 无限循环
            {
                _task(_point.taskArgs);
            } else {
                if (_point.times > 0) {
                    _task(_point.taskArgs);
                    _point.times -= 1;
                    if (_point.times == 0) {
                        window.clearInterval(this.timerID); 
                    }
                }
            }
        }
        
        // 休眠函数
        this.sleep = function(){
            this.busyFlag = true;
        }
        
        // 恢复函数
        this.resume = function(){
            this.busyFlag = false;
        }
        
        // 终止函数
        this.abort = function(){
            window.clearInterval(this.timerID);
        }
    }

    执行结果截了张图,供大家参考:

    javascript多线程


    查看DEMO


    版权属于:jcore.cn

    原文地址:http://www.jcore.cn/2013/04/06/javascript-thread

    除非注明,文章均为原创,转载时必须以链接形式注明原始出处。

    分享文章到:

    热门推荐文章