[编码模式]单线程模拟并发

背景

曾几何时,机器支持的线程数目是一个8位的记录的。这就意味着最多支持的线程数目是255个。如果我们需要同时的执行流上千怎么办。

虽然现在有多核多线程,如果一个CPU已经满足需要你又想减少多线程开发的成本代价。

场景

此模式的核心是一个在单线程中执行的循环。循环通过等待需要的处理的任务。

实例

Task.java

public interface Task {
    public void execute();
}

PrintTask.java

public class PrintTask implements Task {
    @Override
    public void execute() {
        System.out.println(System.nanoTime());
    }
}

ExecuteEngineer.java

import java.util.Stack;

public class ExecuteEngineer {
    private Stack<Task> pendingTasks;
    private static ExecuteEngineer engineer = new ExecuteEngineer();

    private ExecuteEngineer(){
        pendingTasks = new Stack<Task>();
    }

    public static ExecuteEngineer getEngineer(){
        return engineer;
    }

    public void run(){
        while(true){
            Task task = null;

            if(!pendingTasks.isEmpty()){
                task = pendingTasks.pop();
            }

            if(task == null){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else{
                task.execute();
            }
        }
    }

    public void postTask(Task task){
        pendingTasks.push(task);
    }
}

Test.java

public class Test {
    public static void main(String args[]){

        new Thread(){
            @Override
            public void run() {
                ExecuteEngineer.getEngineer().run();
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                while (true){
                    try {
                        Thread.sleep(400);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    ExecuteEngineer.getEngineer().postTask(new PrintTask());
                }
            }
        }.start();
    }
}
时间: 2024-10-24 22:39:05

[编码模式]单线程模拟并发的相关文章

JAVA NIO non-blocking模式实现高并发服务器

JAVA NIO non-blocking模式实现高并发服务器 分类: JAVA NIO2014-04-14 11:12 1912人阅读 评论(0) 收藏 举报 目录(?)[+] Java自1.4以后,加入了新IO特性,NIO. 号称new IO. NIO带来了non-blocking特性. 这篇文章主要讲的是如何使用NIO的网络新特性,来构建高性能非阻塞并发服务器. 文章基于个人理解,我也来搞搞NIO.,求指正. 在NIO之前 服务器还是在使用阻塞式的java socket. 以Tomcat最

关于C# 在TXT写入数据使用UTF-8 bom编码模式

C#中通过 1 StreamWriter sw = new StreamWriter(path, true); 2 sw.WriteLine(Content); 这样的代码写入TXT中的数据默认的编码是GB2312格式,那么如何才能使用utf-8的编码格式写入TXT呢? 代码如下: 1 UTF8Encoding utf8 = new UTF8Encoding(false); 2 StreamWriter sw = new StreamWriter(path, true, utf8); 这样确实使

设计模式之工厂模式:模拟DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC动态创建类对象

该形式的工厂模式是我项目中用到的方法,属于很成熟的模版,读者可以直接拿来在自己项目中使用.个人感觉这种方法真正做到了"开放封闭"的原则,最大好处是用户产品类的设计完全不依赖于该模式的实现,比如提供必须的相关函数等.如果不理解工厂模式的话,请参考网上其它文章,本实现在理解上有一点小小的难度.好东西,大家慢慢享用,话不多说,先放代码! 首先是产品基类,它相当于一个接口,产品需要有什么动作就写在这里吧! #ifndef _CPRODUCTBASE_H_ #define _CPRODUCTBA

【Python】迭代器、生成器、yield单线程异步并发实现详解

转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从理论+程序调试验证的方式详细讲解这部分知识,话不多说,直接进入主题. 一.迭代器(Iterater):     首先介绍迭代器,迭代器是访问集合元素的一种方式,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.是不是觉得跟for循环很像?但是迭代器有几个特性需记住:    1.访问者

C# 模拟并发

每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客! 当然,题外话说多了,咱进入正题! 在处理大数据的时候,经常会发生并发,并发的情况发生后,会出现数据污读,从而产生脏数据. 首先通过一段程序进行说明.<有兴趣的小伙伴可以复制粘贴这段程序>. 项目背景:模拟大转盘抽奖程序. 场下坐有近万名群众,他们在同一时刻同时抽奖,奖品分为一等奖:奔驰汽车10辆,二等奖:别克汽车20辆,三等奖:现代汽车30辆.(奖品信息存入数据库) 奖品信息如下(数据库部分): create tabl

linux系统里模拟并发请求siege

siege压力测试,siege会将接口进行模拟并发,返回每秒的并发数! 一.siege的安装下载:wget 一.siege的安装下载:wget http://download.joedog.org/siege/siege-latest.tar.gz http://www.joedog.org/pub/siege/siege-latest.tar.gz解压: tar -zxvf siege-latest.tar.gzcd siege-..*./configure --prefix=/usr/loc

python单线程解决并发

1.单线程解决并发 方式一 import socket import select # 百度创建连接:非阻塞 client1 = socket.socket() client1.setblocking(False) try: client1.connect(('www.baidu.com', 80)) except BlockingIOError as e: pass # 搜狗创建连接:非阻塞 client2 = socket.socket() client2.setblocking(False

qemu-system和qemu-user两种模式动态模拟运行嵌入式固件方法总结

qemu-system和qemu-user两种模式动态模拟运行嵌入式固件方法总结 前言 搭建嵌入式固件的动态模拟环境的过程中遇到了许多的坑,最终终于搭建了起来,很有必要记录下遇到的问题,避免今后再踩坑. 工具 1.buildroot 下载地址 以buildroot 2019.02.4版本为例,编译mips大端架构环境. tar zxvf buildroot-2019.02.4.tar.gz apt-get install libncurses5-dev make menuconfig Targe

生产者消费者模式下的并发无锁环形缓冲区

上一篇记录了几种环形缓冲区的设计方法和环形缓冲区在生产者消费者模式下的使用(并发有锁),这一篇主要看看怎么实现并发无锁. 0.简单的说明 首先对环形缓冲区做下说明: 环形缓冲区使用改进的数组版本,缓冲区容量为2的幂 缓冲区满阻塞生产者,消费者进行消费后,缓冲区又有可用资源,由消费者唤醒生产者 缓冲区空阻塞消费者,生产者进程生产后,缓冲区又有可用资源,由生产者唤醒消费者 然后对涉及到的几个技术做下说明: ⑴CAS,Compare & Set,X86下对应的是CMPXCHG 汇编指令,原子操作,基本