⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch02s02.html

📁 优秀的java程序开发软件方式与方法,对大家开发程序的时候有指导性帮助
💻 HTML
字号:
<html><head>      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">   <title>2.&nbsp;&#36739;&#22797;&#26434;&#30340;continuation&#24212;&#29992;&#65306;coroutine</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.69.1"><link rel="start" href="index.html" title="Java&#32593;&#32476;&#31243;&#24207;&#21592;&#30475;Continuation"><link rel="up" href="ch02.html" title="Chapter&nbsp;2.&nbsp;Continuation&#65292;call/cc&#20989;&#25968;&#19982;&#22238;&#36864;&#65295;&#21047;&#26032;&#38190;"><link rel="prev" href="ch02s01.html" title="1.&nbsp;Continuation&#21021;&#27493;"><link rel="next" href="ch02s03.html" title="3.&nbsp;&#32593;&#32476;&#26694;&#26550;&#20013;&#29992;continuation"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.&nbsp;&#36739;&#22797;&#26434;&#30340;continuation&#24212;&#29992;&#65306;coroutine</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s01.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;2.&nbsp;Continuation&#65292;call/cc&#20989;&#25968;&#19982;&#22238;&#36864;&#65295;&#21047;&#26032;&#38190;</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e176"></a>2.&nbsp;&#36739;&#22797;&#26434;&#30340;continuation&#24212;&#29992;&#65306;coroutine</h2></div></div></div><p>&#25105;&#20204;&#26469;&#30475;&#19968;&#20010;&#27604;&#36739;&#22797;&#26434;&#30340;&#20363;&#23376;&#65292;&#33879;&#21517;&#30340;producer/consumer&#38382;&#39064;&#12290;&#23427;&#26159;continuation&#30340;&#20960;&#20010;&#32463;&#20856;&#29992;&#27861;&#20043;&#19968;&#12290;&#19968;&#20010;&#20989;&#25968;&#65292;producer&#65292;&#29983;&#25104;&#19968;&#31995;&#21015;object&#65292;&#21478;&#19968;&#20010;&#20989;&#25968;&#65292;consumer&#65292;&#22788;&#29702;&#36825;&#20123;object&#12290;&#36825;&#20010;&#38382;&#39064;&#30340;&#19968;&#20010;&#35299;&#27861;&#26159;&#29992;&#22810;&#32447;&#31243;&#65292;UNIX&#19979;&#30340;pipe&#23601;&#26159;&#19968;&#20010;&#20856;&#22411;&#30340;&#20363;&#23376;&#12290;&#36825;&#37324;&#25105;&#20204;&#29992;continuation&#22312;&#19968;&#20010;&#32447;&#31243;&#20869;&#35299;&#20915;&#21516;&#26679;&#30340;&#38382;&#39064;&#12290;&#25105;&#20204;&#26469;&#30475;Ruby&#20195;&#30721;&#65306;</p><pre class="programlisting"># ------------------------------------# Simple Producer/Consumer# ------------------------------------# Connect a simple counting task and # a printing task together using# continuations.def count_task(count, consumer)  (1..count).each do    |i|    consumer = callcc {|cc|                        consumer.call cc, i }  endenddef print_task()  producer, i = callcc {|cc| return cc }  while true    print "#{i} "    producer, i = callcc {|cc|                           producer.call cc }  endenddef count(limit)  count_task(limit, print_task())  print "\n"endcount(10)</pre><p>&#19978;&#38754;&#30340;producer&#26159;count_task&#65292;consumer&#26159;print_task&#65292;&#24471;&#21040;&#30340;&#36755;&#20986;&#26159;1 2 3 4 5 6 7 8 9 10&#12290;&#25105;&#20204;&#26469;&#31616;&#35201;&#22320;&#30475;&#30475;&#23427;&#26159;&#22914;&#20309;&#24037;&#20316;&#30340;&#12290;</p><p>&#22312;count&#20989;&#25968;&#20013;&#65292;&#25105;&#20204;&#39318;&#20808;&#35843;&#29992;print_task()&#20989;&#25968;&#12290;&#35813;&#20989;&#25968;&#31435;&#21051;&#35843;&#29992;callcc&#12290;&#22312;callcc&#30340;closure&#20013;&#65292;print_task&#36820;&#22238;&#33267;count&#20989;&#25968;&#12290;&#65288;&#27880;&#24847;closure&#20013;&#30340;return&#19981;&#26159;&#23548;&#33268;&#35813;closure&#36820;&#22238;&#32780;&#26159;&#23548;&#33268;print_task&#20989;&#25968;&#36820;&#22238;&#65289;&#36825;&#26102;&#25105;&#20204;&#35843;&#29992;count_task&#20989;&#25968;&#65292;&#20854;&#31532;&#20108;&#20010;&#21442;&#25968;&#23601;&#26159;print_task&#25191;&#34892;&#33267;&#31532;&#19968;&#34892;&#30340;continuation&#65292;&#20063;&#21363;&#22312;print_task&#20989;&#25968;&#24403;&#20013;&#30340;&#19968;&#20010;&#24555;&#29031;&#12290;&#25509;&#19979;&#26469;&#30340;count_task&#20989;&#25968;&#26159;ruby&#30340;&#19968;&#31181;&#24490;&#29615;&#35821;&#27861;&#65292;&#32763;&#35793;&#25104;&#31867;&#20284;Java&#30340;&#35821;&#27861;&#23601;&#26159;&#65288;&#20197;&#19979;&#20195;&#30721;&#19981;&#31526;&#21512;&#20219;&#20309;&#35821;&#35328;&#65289;&#65306;</p><pre class="programlisting">void count_task(count, consumer)  for (i = 1; i &lt;= count; i++) {    consumer = callcc {|cc|                        consumer.call(cc, i) };  }end</pre><p>&#27880;&#24847;&#21040;ruby&#37324;&#30340;&#21464;&#37327;&#19981;&#24517;&#22768;&#26126;&#31867;&#22411;&#12290;&#20989;&#25968;count_task&#20250;&#37325;&#22797;&#21313;&#27425;&#65292;&#27599;&#27425;&#23427;&#20250;&#33719;&#21462;&#24403;&#21069;&#29366;&#24577;&#30340;&#24555;&#29031;&#65292;&#24182;&#23558;&#35813;continuation&#21644;i&#19968;&#36215;&#20256;&#32473;consumer&#36825;&#20010;continuation&#12290;&#21069;&#38754;&#25105;&#20204;&#30475;&#21040;&#65292;consumer&#23384;&#20648;&#30340;&#26159;print_task&#31532;&#19968;&#34892;&#30340;&#29366;&#24577;&#65292;&#25152;&#20197;&#36825;&#26102;print_task&#31532;&#19968;&#34892;&#30340;callcc&#20250;&#36820;&#22238;&#20004;&#20010;&#20540;&#65292;&#19968;&#20010;&#26159;producer continuation&#65292;&#19968;&#20010;&#26159;i&#12290;&#28982;&#21518;print_task&#36827;&#20837;&#19968;&#20010;&#27515;&#24490;&#29615;&#65292;&#36755;&#20986;i&#65292;&#24182;&#35843;&#29992;producer&#36825;&#20010;continuation&#65306;producer.call&#12290;&#36825;&#26102;&#25105;&#20204;&#23601;&#21448;&#20250;&#36339;&#22238;count_task&#24403;&#20013;&#12290;&#27880;&#24847;&#21040;product.call&#26377;&#19968;&#20010;&#21442;&#25968;&#65292;&#26159;print_task&#30340;current continuation&#65292;&#25152;&#20197;&#22312;count_task&#20013;&#65292;consumer continuation&#20250;&#25913;&#32780;&#35760;&#36733;print_task&#22312;while true&#24490;&#29615;&#20013;&#30340;&#29366;&#24577;&#12290;&#25509;&#19979;&#21435;&#30340;&#36807;&#31243;&#23601;&#27604;&#36739;&#31616;&#21333;&#20102;&#65292;count_task&#21644;print_task&#20004;&#20010;&#20989;&#25968;&#20250;&#20114;&#30456;&#35843;&#29992;&#23545;&#26041;&#30340;continuation&#65292;&#21516;&#26102;&#20256;&#32473;&#23545;&#26041;&#33258;&#24049;&#30340;current continuation&#65292;&#26041;&#20415;&#23545;&#26041;&#20043;&#21518;&#35843;&#29992;&#33258;&#24049;&#12290;&#24744;&#21487;&#20197;&#22810;&#33457;&#28857;&#26102;&#38388;&#23613;&#37327;&#29702;&#35299;&#25972;&#20010;&#36807;&#31243;&#65292;&#20854;&#26680;&#24515;&#30340;&#20004;&#21477;&#20195;&#30721;&#26159;count_task&#30340;consumer = callcc {|cc| consumer.call cc, i }&#21644;print_task&#37324;&#30340; producer, i = callcc {|cc| producer.call cc }&#12290;</p><p>&#36825;&#27573;&#20195;&#30721;&#21487;&#33021;&#24456;&#38590;&#30475;&#25026;&#65292;&#19981;&#36807;&#27809;&#26377;&#20851;&#31995;&#12290;&#27491;&#22914;Ruby&#30340;callcc&#25991;&#26723;&#20013;&#25152;&#35828;&#65292;callcc&#30340;&#20027;&#35201;&#29992;&#36884;&#20043;&#19968;&#23601;&#26159;&#35753;&#31243;&#24207;&#36229;&#32423;&#38590;&#25026;&#12290;&#22909;&#22312;&#20961;&#26159;&#28041;&#21450;callcc&#30340;&#31243;&#24207;&#37117;&#20250;&#20005;&#26684;&#23553;&#35013;&#20854;&#25805;&#20316;&#65292;&#25105;&#20204;&#20960;&#20046;&#27704;&#36828;&#19981;&#38656;&#35201;&#33258;&#24049;&#23454;&#29616;&#36825;&#26679;&#22797;&#26434;&#30340;&#32467;&#26500;&#12290;</p><p>&#25105;&#20204;&#20877;&#22238;&#22836;&#30475;&#30475;count_task&#21644;print_task&#36825;&#20004;&#20010;&#20989;&#25968;&#12290;&#22914;&#26524;&#19968;&#20010;&#26694;&#26550;&#31245;&#24494;&#23553;&#35013;&#19968;&#19979;&#24213;&#23618;&#30340;&#25805;&#20316;&#65292;&#20004;&#20010;&#20989;&#25968;&#21487;&#20197;&#36825;&#26679;&#20889;&#65306;</p><pre class="programlisting">def count_task(count, consumer)  (1..count).each do    |i|    resume_other_function(i)  endenddef print_task()  while true    print "#{i} "    i = resume_other_function()  endend</pre><p>&#36825;&#26679;&#23601;&#27604;&#36739;&#22909;&#29702;&#35299;&#20102;&#65292;&#19978;&#38754;&#30340;&#31243;&#24207;&#30475;&#36215;&#26469;&#23601;&#22909;&#20687;&#26159;&#20004;&#20010;&#32447;&#31243;&#65288;&#36825;&#37324;&#26159;&#20004;&#20010;&#20989;&#25968;&#65289;&#22312;&#21516;&#26102;&#25191;&#34892;&#19968;&#26679;&#65292;&#19981;&#36807;&#20004;&#20010;&#32447;&#31243;&#20043;&#38388;&#30340;&#20999;&#25442;&#21482;&#33021;&#25163;&#21160;&#36827;&#34892;&#65288;&#36825;&#31181;&#22810;&#32447;&#31243;&#32467;&#26500;&#34987;&#31216;&#20026;coorperative multitasking&#65292;&#20197;&#21306;&#21035;&#20110;&#36890;&#24120;&#30340;&#33258;&#21160;&#20999;&#25442;&#32447;&#31243;&#30340;preemptive multitasking&#65289;&#12290;&#31070;&#22855;&#30340;&#26159;&#65292;&#20004;&#20010;&#32447;&#31243;&#20043;&#38388;&#21487;&#20197;&#20256;&#36882;&#21442;&#25968;&#21644;&#36820;&#22238;&#20540;&#65292;&#32780;&#19988;&#21442;&#25968;&#21644;&#36820;&#22238;&#20540;&#21487;&#20197;&#26159;&#20219;&#20309;&#23545;&#35937;&#12290;</p><p>&#36825;&#31181;&#32467;&#26500;&#26377;&#20010;&#21517;&#23383;&#65292;&#21483;&#20570;coroutine&#65292;&#20197;&#19982;&#36890;&#24120;&#30340;subroutine&#30456;&#23545;&#24212;&#12290;Ruby&#35821;&#35328;&#23545;&#23427;&#26377;&#30452;&#25509;&#30340;&#25903;&#25345;&#65292;&#20851;&#38190;&#23383;&#26159;yield&#12290;C# 2.0&#22768;&#31216;&#25903;&#25345;&#31616;&#21333;&#30340;continuation&#65292;&#20854;&#23454;&#20063;&#23601;&#26159;&#25903;&#25345;coroutine&#12290;&#25105;&#20204;&#24050;&#32463;&#30475;&#21040;&#20102;continuation&#21487;&#20197;&#29992;&#26469;&#23454;&#29616;coroutine&#65292;&#20294;&#26159;&#21453;&#20043;&#21017;&#19981;&#28982;&#12290;</p><p>&#19982;coroutine&#30456;&#27604;&#20043;&#19979;&#65292;UNIX&#30340;pipe&#23601;&#30495;&#30340;&#26159;&#20004;&#20010;&#32447;&#31243;&#22312;&#21516;&#26102;&#25191;&#34892;&#65292;&#20004;&#32773;&#20043;&#38388;&#21487;&#20197;&#20256;&#36882;&#25968;&#20540;&#65288;&#20294;&#26159;UNIX&#21482;&#25903;&#25345;&#20256;&#36882;&#23383;&#31526;&#32780;&#38750;&#23545;&#35937;&#12290;&#24403;&#28982;&#65292;&#22914;&#26524;&#37197;&#19978;&#20849;&#20139;&#20869;&#23384;&#65292;UNIX pipe&#20063;&#21487;&#20197;&#20256;&#36882;&#20219;&#20309;&#23545;&#35937;&#65289;&#12290;&#29992;&#22810;&#32447;&#31243;&#35299;producer/consumer&#38382;&#39064;&#20854;&#23454;&#20063;&#19981;&#23481;&#26131;&#65292;&#26377;&#24456;&#22810;&#21516;&#26102;&#24615;&#30340;&#38382;&#39064;&#12290;&#22909;&#22312;&#21644;continuation&#19968;&#26679;&#65292;&#36825;&#20123;&#22788;&#29702;&#21516;&#26102;&#24615;&#30340;&#24213;&#23618;&#25805;&#20316;&#20063;&#20005;&#26684;&#23553;&#35013;&#36215;&#26469;&#20102;&#12290;</p><p>&#21518;&#38754;&#25105;&#20204;&#20250;&#30475;&#21040;&#30340;&#32593;&#32476;&#31243;&#24207;&#37096;&#20214;&#38388;&#30340;call/answer&#21487;&#20197;&#30475;&#25104;&#19968;&#31181;&#31616;&#21333;&#30340;coroutine&#65292;&#19981;&#36807;&#22312;&#36825;&#37324;&#25105;&#20204;&#35762;coroutine&#36825;&#20010;&#20363;&#23376;&#20027;&#35201;&#21482;&#26159;&#20026;&#20102;&#23637;&#31034;&#19968;&#19979;continuation&#27604;&#36739;&#22797;&#26434;&#30340;&#29992;&#27861;&#12290;&#22914;&#26524;&#24744;&#33021;&#30475;&#25026;coroutine&#30340;&#20363;&#23376;&#65292;&#37027;&#20040;&#24744;&#21487;&#20197;&#20572;&#19979;&#26469;&#24819;&#19968;&#24819;&#65292;&#22914;&#20309;&#29992;continuation&#25903;&#25345;&#21518;&#36864;&#38190;&#65311;</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s01.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch02s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">1.&nbsp;Continuation&#21021;&#27493;&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;3.&nbsp;&#32593;&#32476;&#26694;&#26550;&#20013;&#29992;continuation</td></tr></table></div></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -