话不多说,上题目:
19.进程和线程为实现比简单的串行程序复杂的多的程序提供了强大的构造工具,一个很有启发性的程序是早期结构的协同程序.本习题的目的是介绍协同程序. 从文件中读以行为单位的字符串最多80个字符,并通过下列改变把它们打印在包含125个字符的行中,不足以“-”代替,在每行字符串最后插入一个额外的空格字符,并且每行中每对“你妹”字符用“*”代替 a. 开发关于该问题的一种普通的串行程序解决方案,为提高清晰度并减少可能的错误的一种方法是把该程序编写成三个独立的过程,第一个过程读取文件的行,在每一行的后面补充空格,第二个过程将字符流写入一个临时文件或内存中。第三个过程从第二个过程产生的临时文件中读取字符流,按每行125个字符进行处理和打印。 b. 串行方案之所以没有吸引力,是因为临时文件的开销。Conway提出了一种新的程序结构格式:协同程序,它允许把应用程序编写成通过一个字符缓冲区连接起来的三个程序,如例题:在传统的过程中,在调用过程和被调用过程间存在一个主/从的关系,有调用的程序和被调用的程序。协同程序显示出一种对称的关系,在每次进行调用时,从被调用的过程中上一次的活跃点开始执行。由于没有调用过程高于被调用过程的感觉,也就没有返回。相反,任何一个协同程序都可以通过恢复命令把控制传递给另一个协同程序。当一个协同程序第一次被调用时,它在入口被“恢复”,接下来,该协同程序在它拥有上一个恢复命令处被重新激活。注意,程序中一次只能有一个协同程序处于执行状态。 c. 使用同步来完成这个程序 d. 思考,如果过滤的字符串没有预先定下来,程序应该如何编写,试编写完成 - /**
- * 协同程序的伪代码
- */
- public class ConWork {
- //读程序用处理字符
- char rs;
- //打印用处理字符
- char sp;
- char[] inbuff=new char[80];
- char[] outbuff=new char[125];
- /**
- * 读方法
- */
- public void read(){
- while(true){
- //TODO 读内容到inbuff中
- for (int i = 0; i < inbuff.length; i++) {
- rs=inbuff[i];
- //TODO 唤醒处理方法 停止运行等待被唤醒
- }
- rs=' ';
- //TODO 唤醒处理方法 停止运行等待被唤醒
- }
- }
- /**
- * 打印方法
- */
- public void print(){
- while(true){
- for(int j=0;j<125;j++){
- outbuff[j]=sp;
- //TODO 唤醒处理方法 停止运行等待被唤醒
- }
- }
- //TODO 输出outbuff中的内容
- }
- /**
- * 处理方法
- */
- public void squash(){
- while(true){
- if(rs!='你'){
- sp=rs;
- //TODO 唤醒打印方法 停止运行等待被唤醒
- }else{
- //TODO 唤醒读方法 停止运行等待被唤醒
- if(rs=='妹'){
- sp='*';
- //TODO 唤醒打印方法 停止运行等待被唤醒
- }else{
- //这种情况是说明前一个字符是符合的,后一个不符合,所以要还原
- sp='你';
- //TODO 唤醒打印方法 停止运行等待被唤醒
- sp=rs;
- //TODO 唤醒打印方法 停止运行等待被唤醒
- }
- }
- //TODO 唤醒读方法 停止运行等待被唤醒
- }
- }
- }
复制代码题目如上,回复主题可以看到我写的代码,欢迎指点!
|