`
abruzzi
  • 浏览: 452732 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

一个同步打印机的简单实现

阅读更多
  • 内部机制

打印机内部设有缓冲区,当有新任务来到的时候,打印机只是简单的从任务中取出需要打印的消息,然后将其存入自身的缓冲区,然后返回,具体的打印任务交给一个线程来处理,打印线程从缓冲区中读消息,打印,然后等待,直到有别的线程唤醒它。其结构如图所示:

 

syncprinter  

 

  • 单例模式

作为一个系统硬件的模拟,在一个项目中有一个打印机就够用了,在项目中任何需要打印消息的地方,需要使用SyncPrinter.getInstance() 静态方法获取此刻的SyncPrinter实例,并使用print(String message)进行打印。(关于单例模式的细节可以参考别的设计模式的书籍)

  • 同步打印

当然,打印的线程不需要等待打印机缓慢的打印结束,另一种做法是:当打印机收到打印任务后,将此任务放入自己的缓冲区,然后迅速返回,调用打印机的线程可以立即开始接下来的动作,而同时,打印机可以另起一个线程,来打印存储在自己缓冲区中的数据,从而做到同步打印。

缓冲区在本例中实现为一个队列(一个先进先出的数据结构FIFO),队列中的数据总是从尾部插入,从头部被取出。

  • 实现

 

 

 

本例使用JAVA语言实现,当然,任何其他支持线程的语言也可以完成这个任务。

import java.util.LinkedList;
import java.util.List;

public class SyncPrinter {
    private static SyncPrinter instance;
    private List msgQueue;
    private PrintWorker printWorker;

    public static SyncPrinter getInstance(){//单例模式,任何时候系统中只有一个类实例
        synchronized(SyncPrinter.class){
            if(instance == null){
                instance = new SyncPrinter();
            }
        }
        return instance;
    }

    private SyncPrinter(){
        msgQueue = new LinkedList();
        printWorker = new PrintWorker();
        printWorker.start();
    }

    public void print(String message){// 对外公开的使用打印机的接口
        synchronized(msgQueue){
            msgQueue.add(message);
            msgQueue.notify();
        }
    }

    private class PrintWorker extends Thread{//一个执行打印任务的内部类的封装
        private boolean loop = true;
        private Object lock = new Object();

        public void stopPrinter(){
        }

        public void run(){
            while(loop){
                String msg = "";
                synchronized(msgQueue){
                    try {
                        msgQueue.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                // IO
                msg = (String)msgQueue.remove(0);
                if(msg != null){
                    System.out.println(msg);
                }
            }
        }
    }// 对于这个死循环的控制可以做在外部,也可以做在这个类中,通过一个方法来控制,如stopPrinter()
}

 

 

 

  • 小结

这个打印机的意义或许不是很大,但是让快速的线程等待一个缓慢的IO过程是不合理的,同时,这是一种分工的思想,而这种互不干涉,各司其职的做法正是面向对象的核心。

借此文来对面向对象的设计原则做一个巩固,同时也可能会帮助其他需要使用同步打印机的人。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 3.3 KB
分享到:
评论
1 楼 smithsun 2008-11-17  
我对编程不太精通,但看了以后觉得学到了一种新的思想,
我觉得这跟我们平时的工作是一样的,不能说所有的工作都压给一个人。我们可能会有一个接口,专门接收任务。那么这一大堆的任务可以分给相应的精通这一领域工作的人,这样不但充分利用了人力资源,同时还提高了工作效率。
不知道我理解的靠点儿谱不?

相关推荐

    易语言管理多台打印机的默认机选择

    2. **创建事件同步对象**:在需要更改默认打印机之前,先创建一个事件同步对象,用于控制线程间的操作。 3. **选择默认打印机**:根据用户的选择或程序的需求,确定要设为默认的打印机设备。 4. **打开事件同步对象*...

    delphi 控制多台打印机方法

    本篇文章详细介绍了如何在 Delphi 中实现对多台打印机的同时控制,从获取打印机列表到实现多选支持,再到同步选择状态,最后给出了一个简单的打印实现框架。通过这种方式,可以有效地提高应用程序处理多台打印机的...

    Java实现的进程同步与互斥(PV)

    下面是一个简单的Java PV操作示例,模拟了两个线程对一个共享资源(如打印机)的互斥访问: ```java import java.util.concurrent.Semaphore; public class PrintService { private Semaphore printerSemaphore =...

    如何用PV原语实现进程间的互斥与同步

    信号量是一种用于同步进程的数据结构,它可以是一个简单的整数值。当信号量值为正时,表示系统中有可用的共享资源;当信号量值为负时,则表示有进程正在等待获取资源。PV操作就是通过修改这个信号量来达到进程间同步...

    打印机指令

    ZPL命令通常由一个或多个字母组成,后跟参数,如^CFA表示设置字符集,^FO用于定义图形的起始位置(First X, First Y),^GB则用于绘制矩形。在`ZPLcommands.pdf`中,你应该能找到ZPL的详细语法和常用指令的示例,这...

    超级pdf打印机

    它的主要功能是提供一个虚拟打印机驱动,用户在任何支持打印的程序中都可以选择这个“打印机”来创建高质量的PDF文件。这个软件因其简单易用和高效性而备受赞誉。 在PDF(Portable Document Format)打印领域,...

    基于P_V操作的进程同步与互斥实现.pdf

    例如,在简单的互斥问题中只需要一个信号量;而在复杂的同步问题中可能需要多个信号量进行协作。 3. **P操作与V操作的应用**:在进程进入临界区之前执行P操作来尝试获取资源;在退出临界区后执行V操作来释放资源。...

    串口并口驱动三种方式进行打印机测试

    串口是一种数据串行传输接口,它一次传输一位数据,速度相对较慢,但连线简单,常用于短距离通信。并口则是数据并行传输接口,一次性可以传输多位数据,因此速度较快,适合于打印机等需要大量数据传输的设备。然而,...

    斑马打印机并口编程

    以下是一段简单的示例代码,展示了如何通过C语言向斑马打印机发送ZPL指令: ```c #include #include #include #include #define LPT_PORT 0x378 // 并口地址 void send_data(unsigned char data) { outb...

    打印机维修资料大全

    以上汇总了各类打印机常见故障及维修建议,涉及HP、三星、美能达、EPSON、联想、兄弟、方正等多个品牌,涵盖了卡纸、打印浅、报警、兼容性、加热膜、鼓芯、激光器、触点、显影套、搓纸轮、粉盒等关键部件的故障排查...

    任务的同步 与通信 任务的同步 与通信

    当一个任务获取一个信号量时,如果资源可用,任务会得到资源并持有信号量;否则,任务会被挂起,直到信号量变为可用。二进制信号量只有两种状态,占用和空闲,常用于简单的互斥访问场景。 邮箱是另一种通信机制,...

    基于飞思卡尔单片机的微型热敏打印机的设计与实现

    在飞思卡尔单片机平台上的设计,可以充分利用其丰富的外设接口和处理能力,通过精心的设计,实现一款性能稳定、体积小巧的热敏打印机。在设计中,应特别注意热敏头的过热保护以及步进电机驱动的精确控制,这两部分是...

    操作系统实验之进程同步

    在操作系统领域,进程同步是一个至关重要的概念,它涉及到多个并发执行的进程之间的协调与通信,以确保它们能正确、有序地共享资源和执行任务。在这个实验中,我们深入理解了进程同步的原理及其在实际系统中的应用。...

    南天pr9打印机控制程序

    在描述中提到的“南天PR9打印机控制程序”包含了详细的控制指令,对于理解和开发串口打印程序的程序员来说,这是一个宝贵的资源。 串口打印,也称为RS-232通信,是一种通过串行接口进行数据传输的技术。这种通信...

    C++使用ESC指令实现打印

    在C++编程中,"ESC指令"通常指的是ASCII码中的转义序列,这些序列由一个反斜杠(\)和一个字母组成,用于在文本输出中执行特殊功能,如设置颜色、控制光标位置等。在串口通信中,利用ESC指令可以控制打印机或其他...

    基于单片机的打印机设计.doc

    综上所述,基于89C52单片机的微型打印机设计充分利用了单片机的灵活性和控制能力,通过精密的硬件布局和软件编程,实现了打印过程的精确控制和高效的内存管理,为微型打印机提供了一种可靠的解决方案。这种设计方法...

    微型打印机控制电路的毕业设计.doc

    综上所述,这个毕业设计的核心是设计一个基于单片机的微型打印机控制系统,该系统应具备多种打印命令支持、能输出数字和汉字,并保证可靠性和便携性。设计内容包括硬件选型、电路设计、软件编程等多个方面,涵盖了...

    第 单片机控制打印机PPT学习教案.pptx

    单片机控制打印机是嵌入式系统中常见的一种应用场景,主要涉及到硬件接口设计和软件编程技术。本教程重点讲解了如何使用51系列单片机控制LASER PP40微型打印机,这是一种支持文本和图形模式的四色描绘式微型打印机。...

Global site tag (gtag.js) - Google Analytics