4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:

Slides:



Advertisements
Similar presentations
单元二:面向对象程序设计 任务二:借书卡程序设计.
Advertisements

3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
项目6 通用堆栈.
檔案處理.
“亲子教育”心理成长任务 主讲:刘晓红 广州中医药大学心理辅导中心 主任 国家心理咨询师职业资格 培训师 全国人才专业技术能力测评EAP 高级讲师.
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
体育教师提高科研能力的有效策略 ——从观察、分析、选题、构思谈起
MVC Servlet与MVC设计模式.
算法设计与分析 Algorithm Design and Analysis
山东大学附属中学 甄广军 Tel: 初中体育 课堂教学设计要点 山东大学附属中学 甄广军 Tel:
第二章 JAVA语言基础.
程式設計實作.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
Q1: 追蹤程式: 印出結果? 搶答 while (i<=n) { p=p*i; i=i+2; }
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
Java语言程序设计 清华大学出版社 第9章 网络通信.
例外處理(Exception Handling)
Java 第28讲:建立删除文件 主讲教师:李焱 讲师.
Java语言程序设计 第七部分 多线程.
Java基础 JavaSE异常.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
Multithread 多執行緒 I/O Lecturer:楊昌樺.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
第四章 基本輸出入 Java應用程式的輸出入介面有三種,分別是命令提示字元視窗、AWT元件、及Swing元件。本單元先介紹命令提示字元視窗,AWT請看第16、17章,Swing請看第20章。 輸入 輸出.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第九章 输入/输出流.
程序设计期末复习 黎金宁
程式撰寫流程.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
Java语言程序设计 第五部分 Java异常处理.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
辅导课程十三.
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
异常及处理.
C/C++/Java 哪些值不是头等程序对象
C#程序设计基础 第二章 数据类型.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
第三章 C# 基础知识.
Multithread 多執行緒 以GUI為例了解物件以及Event
Week 2: 程式設計概念與 演算法的效能評估
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第二章Java基本程序设计.
第二章 Java基本语法 讲师:复凡.
Today is Monday 高年級晨間美語.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
龍老師我不會Debug QQ.
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
第二章 Java基本语法 讲师:复凡.
硬幣遊戲解題詳解 王豐緒 銘傳大學資訊工程學系.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: Email: QQ: 13684285460 xmj.cn@163.com 156638267

1 任务引入 线程之间不是孤立的,线程之间往往要进行信息交换,由于信息的多样性,对不同信息的处理方式是不同的,通常在基于TCP的聊天通讯过程中,通信信息被封装在一个消息对象中,要实现消息对象在网络上的传输,该消息类必须能够被“序列化”。监听线程在接收到消息对象后,将消息对象交给一个服务线程处理,服务线程根据消息对象的分类,有两种处理方式,对“命令类”消息,服务线程直接处理,对“聊天消息”,服务线程做日志记录,并将该消息对象添加到一个消息对象队列中,消息接收线程从消息对象队列中取出消息对象,并做相应的处理。 2/17

2 任务讨论 用于线程间传递信息的中间类设计;如何传递中间类。 3/17

3 对象流 对象的持续性(Persistence) 能够纪录自己的状态以便将来再生的能力,叫对象的持续性。对象的持续性通常应用在网络传输、介质存储等方面。对象的持续性通过串行化完成。 对象的串行化(Serialization) 对象通过写出描述自己状态的的数值来记录自己的过程叫串行化。串行化的主要任务是写出对象实例变量的数值,如果变量是另一个对象的引用,则引用的对象也要串行化。这个过程是递归的。 对象流概念 能够输入输出对象的流称为对象流。可以将对象串行化后通过对象输入输出流写入文件或传送到其它地方。 4/17

3 用管道流实现线程间的通信 管道用来把一个程序、线程和代码块的输出连接到另一个程序、线程和代码块的输入。java.io中提供了类PipedInputStream和PipedOutputStream作为管道的输入/输出流。 线程1 PipedOutputStream PipedInputStream 输出流outStream 输入流inStream 线程2 主类Pipethread 辅类myWriter 线 程 类 辅类 myReader 管 道 流 将数据写到输出流 从输入流中读数据 输出流作为参数 传给myWriter 输入流作为参数 传给myReader 5/17

3 用管道流实现线程间的通信 写线程 6/17 import java.io.*; class myWriter extends Thread { private PipedOutputStream outStream; //将数据输出 private String messages[] = {"Monday", "Tuesday ", "Wednsday", "Thursday", "Friday", "Saturday", "Sunday"}; public myWriter(PipedOutputStream o) { outStream = o; } public void run() { try { ObjectOutputStream p = new ObjectOutputStream(outStream); for (int i = 0; i < messages.length; i++) { System.out.println("Write:" + messages[i]); p.writeObject(messages[i]); p.flush(); p.close(); p = null; } catch (IOException e) {} 写线程 6/17

3 用管道流实现线程间的通信 读线程 7/17 import java.io.*; class myReader extends Thread { private PipedInputStream inStream; //从中读数据 public myReader(PipedInputStream i) { inStream = i; } public void run() { Object data; ObjectInputStream r; boolean reading = true; try { r = new ObjectInputStream(inStream); while (reading && r != null) { data = r.readObject(); if (data != null) { System.out.println("Read: " + data.toString()); } else { reading = false; r.close(); } catch (IOException e) {} catch (ClassNotFoundException e) {} 读线程 7/17

3 用管道流实现线程间的通信 利用管道流的主线程 8/17 import java.io.*; public class Pipethread { public static void main(String args[]) { Pipethread thisPipe = new Pipethread(); thisPipe.process(); } public void process() { PipedInputStream inStream; PipedOutputStream outStream; try{ outStream = new PipedOutputStream(); inStream = new PipedInputStream(outStream); new myWriter( outStream ).start(); new myReader( inStream ).start(); }catch( IOException e ){ } 利用管道流的主线程 8/17

3 通过一个中间类在线程间传递信息 线程2 线程1 中间类m s m.write(s) s=m.read() write() read() 管道流方式自动解决了写线程和读线程之间的互斥共享问题,而自己定义的中间类必须自己解决写线程和读线程之间的互斥共享问题。 9/17

3 通过一个中间类在线程间传递信息 中间类 10/17 public class shareObject { private String value=""; public shareObject() { } public void write(String str){this.value=str;} public String read(){return this.value;} } 中间类 10/17

3 通过一个中间类在线程间传递信息 写线程 11/17 class myWriter extends Thread { private shareObject obj = null; private String messages[] = {"Monday", "Tuesday ", "Wednsday", "Thursday","Friday", "Saturday", "Sunday"}; public myWriter(shareObject obj) { this.obj = obj; } public void run() { try {for (int i = 0; i < messages.length; i++) { System.out.println("Write:" + messages[i]); obj.write(messages[i]); sleep( 400); } } catch (InterruptedException e) {} obj.write("end"); System.out.println("写线程结束"); 写线程 11/17

3 通过一个中间类在线程间传递信息 读线程 12/17 public class myReader extends Thread { private shareObject obj = null; public myReader(shareObject obj) { this.obj = obj; } public void run() { try {String value = obj.read(); while (!value.trim().equals("end")) { if (value.trim().length() > 0) System.out.println("Reader:" + value); sleep(500); value=obj.read(); } } catch (InterruptedException e) {} System.out.println("读线程结束"); 读线程 12/17

4 任务实施 在JBuilder中新建项目。在项目中建立以下6个类。 TransData类:用于网络传输的“消息”,序列化。 DataCache类:“消息队列”,存储需要处理的TransData实例。 listenThread线程类:模拟网络通讯,不断接收不同类型的“消息”,并创建、启动serviceThread线程处理接收到的“消息”。 serviceThread线程类:处理comand型的“消息”,将其他“消息”加入“消息队列”。 messageManager线程类:处理“消息队列”中的“消息”。 mainThread类:主程序,启动listenThread和mesageManager线程。 13/17

5 任务点评 messageManager是单线程,与listenThread线程一起启动。 serviceThread是多线程, listenThread每产生一个“消息”,就创建并启动一个serviceThread线程。 DataCache是一个中间类,负责messageManager线程与serviceThread线程之间传递信息。 14/17

6 试一试 练一练 试改写DataCache,使messageManager线程在读取“消息队列”期间被“阻塞”一会儿。观察程序输出有何变化。 15/17

7 课外拓展 收集资料,了解“对象的持续性 ”应用环境。 16/17

Thank You !