Java多线程同步机制在售票系统的实现
java多线程实际应用案例

java多线程实际应用案例Java多线程是一种并发编程的方式,可以使程序同时执行多个任务,提高程序的执行效率和响应速度。
下面列举了十个Java多线程实际应用案例。
1. 电商网站订单处理:在一个电商网站中,订单的处理是一个非常繁琐且耗时的工作,可以使用多线程实现订单的并发处理,提高订单处理的效率。
2. 聊天软件消息发送:在聊天软件中,用户发送消息是一个频繁的操作,可以使用多线程实现消息的并发发送,提高用户体验。
3. 数据库读写操作:在数据库的读写操作中,读操作可以使用多线程并发执行,提高数据的读取速度;写操作可以使用多线程并发执行,提高数据的写入速度。
4. 图像处理:在图像处理中,可以使用多线程实现图像的并行处理,提高图像处理的速度。
5. 视频编解码:在视频编解码中,可以使用多线程实现视频的并行编解码,提高视频的处理速度。
6. 网络爬虫:在网络爬虫中,可以使用多线程实现并发的爬取网页数据,提高爬虫的效率。
7. 游戏开发:在游戏开发中,可以使用多线程实现游戏的并行处理,提高游戏的运行速度和响应速度。
8. 大数据处理:在大数据处理中,可以使用多线程实现并发的数据处理,提高大数据处理的效率。
9. 并发服务器:在服务器开发中,可以使用多线程实现并发的请求处理,提高服务器的并发能力。
10. 并发任务调度:在任务调度中,可以使用多线程实现并发的任务执行,提高任务的执行效率。
在实际应用中,多线程不仅可以提高程序的执行效率和响应速度,还可以充分利用多核处理器的优势,实现并行计算和并发处理。
然而,多线程编程也面临着诸多挑战,如线程安全、死锁、资源竞争等问题,需要设计合理的线程同步和互斥机制,确保程序的正确性和稳定性。
因此,在使用多线程编程时,需要仔细考虑线程间的依赖关系和数据共享问题,合理规划线程的数量和调度策略,确保多线程程序的正确性和性能。
网上订票系统

网上订票系统摘要随着我国铁路交通的不断发展,简单的窗口售票模式已经不能满足方便人们出行的目的。
采用先进的网络技术开发出方便快捷的网上订票系统是现代客运业务发展的必然需求。
本次设计的火车票网上订票系统通过访问主页,可以实现个人信息注册、车次车票价格查询、在线订票退票等基本功能,为用户提供方便快捷的订票服务。
本毕业设计的内容是设计并且实现一个基于web技术的网上订票网站,故而系统主要以j2EE作为开发基础,主要使用了struts2+spring+hibernate等多种框架的结合使用,用myeclipse作为开发工具,以SQL作为数据库,使用JAVA语言开发,页面采取JSP动态页面开发技术。
该系统界面简单、操作方便,容易维护。
关键词:网上订票网站 ,S.S.H(Struts ,Hibernate ,Spring),JAVA , JSPOnline booking systemAbstractWith the continuous development of China's railway transportation, simple window ticketing mode cannot satisfy the convenient for people to travel to. The use of advanced network technology to develop the online booking system convenient is the inevitable requirement of modern passenger business development. The online train tickets booking system design through the home page, you can realize the basic functions of the personal information registration, the train ticket price query, online booking, refund, provide convenient booking service for users.The contents of this graduation project is to design and implement an online booking website based on Web technology, this system mainly uses j2EE as the basis of development, the main use of the combined use of struts2+spring+hibernate and other frameworks, MyEclipse as a development tool, SQL as the database, using Macromedia's Dreamweaver as the interface landscaping tools, the use of JAVA language development take, page development technology of JSP dynamic pages. The system has a simple interface, easy operation, easy maintenance.Keywords:Online booking site ,Struts2 ,Hibernate ,Spring ,JAVA ,JSP目录摘要 (I)ABSTRACT ........................................................................................................................................ I I 1 绪论. (1)1 绪论 (1)2 系统的开发环境及技术简介 (1)2.1 系统开发环境 (1)2.1.1 MyEclipse (1)2.1.2 数据库简介 (2)2.1.3 Tomcat (2)2.2系统开发的思想与技术 (3)2.2.1JSP技术与MVC模式以及系统的基本框架 (3)2.2.2 S.S.H框架的优点 (3)3 系统总体设计 (6)3.1 总体功能模块 (6)3.2用户的功能模块 (6)3.3 系统业务描述 (7)3.4 程序流程图 (7)4系统详细设计与实现 (9)4.1系统和数据库的配置 (9)4.2概念模型设计 (10)4.3数据库逻辑模型 (10)4.4数据库表结构 (10)4.5平台数据表的设计 (12)5系统功能实现 (18)5.1程序的类图 (18)5.1.1订单Order类图 (18)5.1.2公告Gonggao类图 (19)5.1.3类型Leixing类图 (20)5.1.4票价Piaojia类图 (21)5.1.5时间Shijian类图 (22)5.1.6线路Xianlu类图 (23)5.1.7用户User类图 (24)5.2程序的时序图 (26)5.2.1 公告模块时序图 (26)5.2.2 类型模块时序图 (27)5.2.3 票价模块时序图 (28)5.2.4 线路模块时序图 (29)5.2.5 用户模块时序图 (30)5.3系统功能实现的主要框架 (30)5.3.1 SSH框架 (30)5.3.2 hibernate配置文件 (30)5.3.3 struts配置文件 (32)5.3.4 spring配置文件 (33)5.4系统功能实现的主要模块 (34)5.4.1 登陆页面 (34)5.4.2 用户注册页面 (36)5.4.3 网站主页面 (37)6系统的调试与测试 (39)6.1软件测试的目的 (39)6.2软件测试的任务 (39)6.3测试环境 (39)6.4测试环境的配置 (40)6.4.1 创建安装项目 (40)6.4.2 添加项目输出 (41)6.4.3 运行项目 (43)参考文献 (45)致谢 (46)1 绪论1 绪论火车站市场的管理和规范问题,是困扰我们多年的一个老问题,订票是客运业务中的一个最基本的业务,表面上看,它只是火车站业务的一个简单的部分,但是它涉及到管理与客户服务等多方面,因此,过去传统的售票方式已经不能满足现代客运业务流量剧增的客观要求,这就要求一种全新的订票方式——网上订票,来缓解订票高峰时期的客运压力,并为用户提供方便快捷的订票服务。
多线程同步的实现方法

多线程同步的实现方法在多线程编程中,为了保证数据的正确性和程序的稳定性,需要使用同步机制来控制不同线程之间对共享资源的访问。
本文将介绍几种常见的多线程同步实现方法。
一、互斥锁互斥锁是最基本也是最常用的一种同步机制。
它通过对共享资源加锁来防止其他线程同时访问该资源,从而避免数据竞争和冲突问题。
当一个线程获得了该锁后,其他想要访问该资源的线程就必须等待其释放锁才能进行操作。
在C++11标准中提供了std::mutex类作为互斥量,在使用时可以调用lock()函数获取锁并执行相应操作,再调用unlock()函数释放锁。
需要注意的是,在使用时应尽可能缩小临界区范围以提高效率,并确保所有涉及到共享资源修改或读取操作都被包含在临界区内。
二、条件变量条件变量通常与互斥锁结合起来使用,用于协调不同线程之间对某个事件或状态变化进行响应和处理。
当某个条件满足时(如队列非空),唤醒等待该条件变量上阻塞着的一个或多个进入等待状态(wait)的进程,使其重新参与竞争获取所需资源。
C++11标准库中提供了std::condition_variable类作为条件变量,在使用前需要先创建一个std::unique_lock对象并传递给wait()函数以自动解除已有lock对象,并将当前进入等待状态直至被唤醒;notify_one() 和 notify_all() 函数则分别用于唤醒单个或全部处于等待状态下面向此条件变量发出请求者。
三、信号量信号量是一种更复杂但功能更强大的同步机制。
它通过计数器记录可用资源数量,并根据计数器值判断是否允许新建任务运行或者挂起正在运行任务以便其他任务可以获得所需资源。
其中P(Proberen)表示申请/获取信号灯, V(Verhogen)表示释放/归还信号灯.C++11标准库没有直接支持Semaphore,但我们可以利用mutex+condition_variable模拟实现Semaphore. 其核心思想就是:定义两个成员属性count_ 和 mutex_, count_ 表示当前可申请 Semaphore 的数量 , mutex_ 是 std::mutex 类型 , 定义两个成员方法 wait(), signal(). 四、原子操作原子操作指不能被打断、干扰或交错执行影响结果正确性的操作。
多线程之线程同步的方法(7种)

多线程之线程同步的⽅法(7种)同步的⽅法:⼀、同步⽅法 即有synchronized关键字修饰的⽅法。
由于java的每个对象都有⼀个内置锁,当⽤此关键字修饰⽅法时,内置锁会保护整个⽅法。
在调⽤该⽅法前,需要获得内置锁,否则就处于阻塞状态。
注: synchronized关键字也可以修饰静态⽅法,此时如果调⽤该静态⽅法,将会锁住整个类。
⼆、同步代码块 即有synchronized关键字修饰的语句块。
被该关键字修饰的语句块会⾃动被加上内置锁,从⽽实现同步代码如:synchronized(object){}注:同步是⼀种⾼开销的操作,因此应该尽量减少同步的内容。
通常没有必要同步整个⽅法,使⽤synchronized代码块同步关键代码即可。
package com.xhj.thread;/*** 线程同步的运⽤** @author XIEHEJUN**/public class SynchronizedThread {class Bank {private int account = 100;public int getAccount() {return account;}/*** ⽤同步⽅法实现** @param money*/public synchronized void save(int money) {account += money;}/*** ⽤同步代码块实现** @param money*/public void save1(int money) {synchronized (this) {account += money;}}}class NewThread implements Runnable {private Bank bank;public NewThread(Bank bank) {this.bank = bank;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {// bank.save1(10);bank.save(10);System.out.println(i + "账户余额为:" + bank.getAccount());}}}/*** 建⽴线程,调⽤内部类*/public void useThread() {Bank bank = new Bank();NewThread new_thread = new NewThread(bank);System.out.println("线程1");Thread thread1 = new Thread(new_thread);thread1.start();System.out.println("线程2");Thread thread2 = new Thread(new_thread);thread2.start();}public static void main(String[] args) {SynchronizedThread st = new SynchronizedThread();eThread();}}=====================================⽰例加讲解同步是多线程中的重要概念。
【实验】java多线程实验报告

【关键字】实验java多线程实验报告篇一:西北农林科技大学java多线程实验报告实验7 多线程1.实验目的(1) 掌握Java多线程的概念和实现方法(2) 掌握Java多线程的同步问题2.实验内容任务一:火车售票假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒买一张票。
打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。
程序运行结果见左图。
打开EclipseTickets.javapublic class Ticket extends Thread {int ticket =1000; String name =""; public void run(){ while(true){synchronized(name){ if(ticket"第" + Thread.currentThread().getName()+ "售票点卖出了第" + ticket-- + "张票");}} }}} try{ } catch(InterruptedException e){ } Thread.sleep(100);Test.javapublic class Test {} public static void main(String args[]){} Ticket t = new Ticket(); new Thread(t,"1").start(); new Thread(t,"2").start(); new Thread(t,"3").start(); new Thread(t,"4").start(); new Thread(t,"5").start(); new Thread(t,"6").start(); new Thread(t,"7").start(); new Thread(t,"8").start(); new Thread(t,"9").start(); new Thread(t,"10").start();任务二:银行存款假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。
java抢票实现思路

Java抢票实现思路引言抢票系统是一种常见的在线购票系统,用户可以通过系统预订票务,然后在指定的时间内进行抢票。
在这个过程中,需要使用Java编程语言实现一套简单而高效的抢票系统。
本文将从需求分析、系统设计以及实现细节等方面解析Java抢票系统的实现思路。
需求分析在开始实现抢票系统之前,首先需要明确系统的需求和功能。
以下是我们提取出的主要需求和功能:1.用户登录:用户需要先进行登录才能进行抢票操作。
2.抢票查询:用户可以通过系统查看当前的票务信息和余票数量。
3.抢票:用户可以选择某一场次的票务进行抢票,当票数不足时,系统会提示用户抱歉。
4.订单管理:用户可以查看已成功抢购的订单,并进行订单的取消或修改。
5.系统管理:管理员可以管理票务信息,包括新增、修改和删除票务。
系统设计根据需求分析,我们将系统设计分为以下几个模块:1.用户模块:负责用户登录、注册和管理用户信息。
2.票务模块:负责票务的查询、抢票和管理。
3.订单模块:负责订单的生成、取消和管理。
4.管理员模块:负责票务信息的管理。
用户模块用户模块是系统的核心模块之一,以下是用户模块的设计思路:1.用户信息存储:用户信息可以使用数据库进行存储,包括用户名、密码、手机号码等。
2.用户登录:用户需要提供正确的用户名和密码进行登录,系统会对用户输入的密码进行校验。
3.用户注册:用户可以通过手机号码进行注册,系统会发送验证码到用户手机上,并验证验证码的正确性。
票务模块票务模块是系统的核心模块之一,以下是票务模块的设计思路:1.票务信息存储:票务信息可以使用数据库进行存储,包括场次、价格、余票数量等。
2.票务查询:用户可以通过系统查看当前的票务信息和余票数量。
3.抢票逻辑:用户可以选择某一场次的票务进行抢票,系统会判断余票数量,如果余票数量大于0,则生成订单;如果余票数量为0,则提示用户抱歉。
订单模块订单模块是系统的核心模块之一,以下是订单模块的设计思路:1.订单信息存储:订单信息可以使用数据库进行存储,包括用户ID、票务ID、数量、状态等。
java数据同步解决方案

java数据同步解决方案在Java开发中,数据同步是一个常见的需求。
无论是不同数据库之间的数据同步,还是不同系统之间的数据同步,都需要一个可靠的解决方案来实现。
本文将介绍一种基于Java的数据同步解决方案,帮助开发者快速高效地实现数据同步功能。
首先,我们需要明确数据同步的基本原理。
数据同步是指将数据从一个地方复制到另一个地方,确保数据在不同系统之间的一致性。
在Java中,我们可以利用数据库的触发器、定时任务或者消息队列来实现数据同步。
触发器可以在数据库中监控数据变化,并在数据变化时触发相应的操作;定时任务可以定期检查数据变化,并将变化的数据同步到目标系统;消息队列可以将数据变化以消息的形式发送到目标系统,实现异步数据同步。
其次,我们需要选择合适的技术栈来实现数据同步。
在Java中,我们可以使用Spring框架来简化数据同步的开发。
Spring提供了丰富的模块,如Spring JDBC、Spring Transaction、Spring Task等,可以帮助我们快速地实现数据同步功能。
同时,我们也可以结合其他开源框架,如Quartz、MyBatis等,来实现更灵活、高效的数据同步方案。
接着,我们需要考虑数据同步的性能和可靠性。
数据同步涉及到大量的数据读写操作,因此性能是一个关键的考量因素。
我们可以通过优化SQL查询、合理设计数据同步流程、增加数据同步监控等手段来提升数据同步的性能。
同时,我们也需要考虑数据同步的可靠性,如数据一致性、幂等性、容错处理等,以确保数据同步的稳定可靠。
最后,我们需要考虑数据同步的扩展性和灵活性。
随着业务的发展,数据同步的需求可能会发生变化,我们需要一个灵活的解决方案来应对不同的需求。
在Java中,我们可以利用设计模式、接口抽象、配置文件等手段来实现数据同步的扩展和定制,以满足不同业务场景下的需求。
综上所述,基于Java的数据同步解决方案需要考虑数据同步的基本原理、选择合适的技术栈、保证数据同步的性能和可靠性,以及实现数据同步的扩展和灵活性。
Java多线程同步问题分析

} }
c a s Ti ke Exam pl ls c t e
{ p bi tt od manSr g]ag ) u l s i v i i(ti [ rs c ac n {
sat) tr( 方法来运行 rn ) u (方法售 2 0张票。代 码如下 :
c a s Ti k t e e d l s c e xt n s Thr a ed
关键词 : M; 程 ; J V 进 多线 程 ; 享 数据 ; 共 同步 机 制
中图分类号 :P 1 T 32
文献标识码 : A
D :03 6  ̄i n1 0—9 02 1. .1 OI 1. 9 .s . 367 . 20 0 0 9 s 0 0 4
An l ss o h r b e o li h e d S n h 0 i a in i a a a y i n t e P o l m f Mu t-t r a y c r n z t0 n J v
可 能 产 生 不 可 预 料 甚 至 是 错 误 的 结 果 , 就 需 要 用 Jv 这 a a同 步
it k ) f i >0 (c
{ S t m . u . r n l n me s l ” yse 0 t P i tn( a +” a e:
+ ik - ;/ t - )】 /卖 出一张票之后 , c 票就 减少一张
个 用 户 操 作 同一 个 共 享 数 据 库 时 所 产 生 的 问 题 , 及 到 Jv 涉 aa
j
p bi v i u ( /售票 u l od r n) c / { wh ef g l l i (a )
{
多 线 程 编 程 及 同 步 E a a虚 拟 机 (VM )1 供 了 完 全 意 义 2 1 v 。J J [提 l 上 的多线程编程 , 多线 程 设 计 提 高 了程 序 运 行效 率 , 是 多 个 但 线 程共 享相 同的内存 空 间, 对共 享数据 进行操 作的时 候 , 在 就
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java多线程同步机制在售票系统的实现
论文导读:多线程技术的思想已经使用了很长的一段时间。
但其不支持相同优先级的时间片轮换。
多个用户线程在并发运行过程中可能同时访问临界区的内容。
在Java中定义了线程同步的概念。
关键词:多线程技术,多线程优先级,时间片,同步,临界区引言:多线程技术的思想已经使用了很长的一段时间,它允许CPU处理器时间共享,即很多用户可以共享处理器,每个用户的任务都分配到一段处理器时间。
多线程是现代操作系统有别于传统操作系统的重要标志之一,它有别于传统的多进程的概念。
所谓线程就是程序中的一个执行流,多线程程序是指一个程序中包含有多个执行流,多线程是实现并发机制的一种有效手段。
进程和线程一样,都是实现并发性的一个基本单位。
1.基本概念:1.1线程与进程的主要区别:①同样作为基本的执行单元,线程的划分比进程小。
②多进程每个占有独立的内存空间,而多线程共享同一内存空间,通过共享的内存空间来交换信息,切换效率远远高于多进程。
③Java线程调度器支持不同优先级线程的抢占方式,但其不支持相同优先级的时间片轮换。
④Java运行时系统所在的操作系统(例如:Windows XP)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。
免费论文参考网。
1.2Java 多线程的特点:1.2.1多线程的继承由于Java引入了包的概念,从而使类的继承更加简便,线程的创建就是一个最好的例子。
Java多线程的实现有两种办法①通过Thread继承,在下面的研究中,我主要用继承自Thread类来实现Java的多线程技术。
②通过Runnable接口。
1.2.2Java多线程的同步技术Java应用程序的多个线程共享同一进程的数据资源,多个用户线程在并发运行过程中可能同时访问临界区的内容,为了程序的正常运行,在Java中定义了线程同步的概念,实现对临界区共享资源的一致性的维护。
1.3.3Java多线程的流程控制Java流程控制的方法有Sleep().Interrupt().Wait().Notif().Join()等。
1.3.4临界区在一个多线程的程序当中,单独的并发的线程访问代码段中的同一对象,则这个代码段叫做临界区,我们需要用同步的机制对代码段进行保护,避免程序出现不确定的因素。
1.3.5同步机制Java中支持线程的同步机制,它由synchronized方法实现,分为同步块和同步方法,在下面的讨论中用synchronized的同步块来解决问题。
2.多线程同步机制在车票系统的实现2.1下面就以售票系统中所涉及的问题来讨论Java的多线程同步机制问题,在售票系统中由于很大一部分时间可能有多人在购买车票,所以必须开辟多个线程同时为他们服务,在这里我设有四个售票窗口,则开辟四个线程来为四个窗口服务模拟图如下:窗口 1 窗口2窗口 3 窗口4Thread1Thread2 Thread3Thread4售票窗口模拟图 2.2出错的程序代码如下:class TicketsSystem{public staticvoid main(String[] args){SellThread kt=new SellThread();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();}}class SellThreadextends Thread{inttickets=60;public
voidrun(){while(true){if(tickets>0){System.out.println(Thread.currentThr ead().getName()+'sellticket '+tickets);tickets--;}}}}在上面的程序中为了
简单起见,我把一班车的车票数定为60张。
这个系统在交付使用后的一段时间后,车站管理人员说系统出错了,当票卖完了60张后,当还有人来买票后,它有时还会打印出票来,当然这种情况并不多见。
我仔细研究后得知出错的主要原因是当第一个售票窗口(Thread1)进入if(tickets>0){System.out.println(Thread.currentThread().getName()+' sellticket'+tickets);Tickets--;}代码段后,它的时间片到期,然后第二个售票窗口(Thread2)进入if代码段,它的时间片已到期。
然后第三个窗口(Threas3)进入if代码段。
免费论文参考网。
同理第四个窗口(Thread4)以一样。
当然这种线程在进入代码段后时间片到期的现象并不多见,但作为车站长时间工作的售票系统来说,这种错误就可能发生,而且一旦发生将带来灾难性的后果。
为了便于观察到这个错误,我调用了Thread类中的Sleep()方法,程序中的错误就直观的表现出来。
免费论文参考网。
2.3直观反映出错的程序如下:class TicketsSystem{public staticvoid main(String[] args){SellThread kt=new SellThread();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();}}class SellThreadextends Thread{inttickets=60;public
voidrun(){while(true){if(tickets>0){try{Thread.sleep(20);}catch(Exception e){e.printStackTrace();}System.out.println(Thread.currentThread().getNa me()+'sellticket '+tickets);tickets--;}}}}运行结果如下:Thread-1 sellticket 60Thread-1 sellticket 59…………….…………….Thread-4 sellticket 1Thread-3
sellticket 0Thread-1 sellticket -1Thread-1 sellticket -2从上面的执行结果就可以看出为什么系统中票已卖完还可以继续卖几张的原因,就是因为当系统中只有一张票的时候,第一个线程都进入了if代码段里面,它睡眠20毫秒,第二个线程进入if代码段里面,它已睡眠20毫秒。
以此类推,第三,第四个线程if代码段里面,从而导致了系统继续把0,-1,-2的票打印出来,这当然不是我们想要的结果。
下面我采用Java多线程同步机制中的同步块技术来完善这个代码段,问题得以解决。
2.4修改后的程序代码如下:classTicketsSystem{public staticvoid main(String[] args){SellThread kt=new SellThread();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();new Thread(kt).start();}}class SellThreadextends Thread{Object obj=new Object();;inttickets=60;public
voidrun(){while(true){synchronized(obj){if(tickets>0){try{Thread.sleep(20 );}catch(Exception
e){e.printStackTrace();}System.out.println(Thread.currentThread().getNa me()+'sellticket '+tickets);tickets--;}}}}}它的实现原理是当有一个线程进入同步块之后,其它线程就没有机会进入同步块程序,只能等到进入同步块的线程退出以后才能进入同步块程序,这样就避免了系统在车票卖完了以后还能继续卖票的问题。
结束语:本文讲述的关键问题是借助多线程的同步机制来解决长途汽车站售票系统中的售票系统的不稳定的问题.我们借助多线程的同步机制解决了上述问题,使系统得以高效地运行.参考文献:1.Java编程思想Bruce Eckel 著候捷译机
械工业出版社20052.Java面向对象程序设计Paul S.Wang 著杜一民译清华大学出版社20033.Java网络高级编程金勇华曲俊生等著人民邮电出版社20024.Java程序设计与应用开发於东军杨静宇等著清华大学出版社20055.Java与模式阎宏著电子工业出版社20026.Java2从入门到精通JohnZukowski 著电子工业出版社2000。