[{"data":1,"prerenderedAt":239},["ShallowReactive",2],{"archive-2013-9-1":3},{"title":4,"articles":5,"hot_article":25,"month_arch":88,"total":7,"cover":236},"2013年9月 - 独孤影的博客",[6,16],{"id":7,"title":8,"uri":8,"author":9,"tags":10,"created_at":13,"view_count":14,"content":15},2,"Java线程编程","duguying",[11,12],"java","线程","2013-09-01 06:33:00",3925,"\u003Cp>最近学习了一下网络编程，因此就无可避免的学习了多线程编程，先后经过在C#、C以及Java环境下编程，有所斩获。以下是Java环境下线程编程的一些总结：\u003C\u002Fp>\u003Col class=\" list-paddingleft-2\">\u003Cli>\u003Cp>\u003Cspan style=\"font-size: 12.5px;\">创建线程\u003C\u002Fspan>\u003Cbr\u002F>\u003C\u002Fp>\u003C\u002Fli>\u003Cp>实例化Thread类\u003C\u002Fp>\u003Cpre class=\"brush:java;\">Receive&nbsp;rcv;\nThread&nbsp;th1=new&nbsp;Thread(rcv);\u003C\u002Fpre>\u003Cp>其中Receive rcv要通过override抽象类Runnable来实现\u003C\u002Fp>\u003Cli>\u003Cp>\u003Cspan style=\"font-size: 12.5px;\">重载抽象类Runnable\u003C\u002Fspan>\u003Cbr\u002F>\u003C\u002Fp>\u003C\u002Fli>\u003Cp>主要是重载其中的run方法，因为线程启动的目标函数就是重载后的run()方法，示例如下：\u003C\u002Fp>\u003Cpre class=\"brush:java;\">\n&nbsp;public&nbsp;class&nbsp;Receive&nbsp;implements&nbsp;Runnable{\n&nbsp;&nbsp;@Override\n&nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(&quot;sdjfhsdjf&quot;);\n&nbsp;&nbsp;}\n&nbsp;&nbsp;public&nbsp;static&nbsp;Receive&nbsp;init(){\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Receive();\n&nbsp;&nbsp;}\u003C\u002Fpre>\u003Cli>\u003Cp>\u003Cspan style=\"font-size: 12.5px;\">启动线程\u003C\u002Fspan>\u003Cbr\u002F>\u003C\u002Fp>\u003C\u002Fli>\u003Cpre class=\"brush:java;\">th1.start();\u003C\u002Fpre>\u003Cp>线程启动后将会执行rcv.run();\u003C\u002Fp>\u003C\u002Fol>",{"id":17,"title":18,"uri":18,"author":9,"tags":19,"created_at":22,"view_count":23,"content":24},1,"fork()函数",[20,21],"fork","进程","2013-09-24 06:34:00",5685,"\u003Cp>fork函数可以复制一个当前进程。看代码\u003C\u002Fp>\u003Cpre class=\"brush: cpp;\">#include&nbsp;&lt;stdio.h&gt;\nint&nbsp;main(void){\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;pid;\n&nbsp;&nbsp;&nbsp;&nbsp;pid=fork();\n&nbsp;&nbsp;&nbsp;&nbsp;if(pid&gt;0){\u002F\u002F在父进程\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"Parents&nbsp;Process,&nbsp;The&nbsp;son&nbsp;pid:&nbsp;%d\\n\",&nbsp;pid);\n&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if(0==pid){\u002F\u002F在子进程\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"Son&nbsp;Process,&nbsp;The&nbsp;pid&nbsp;return:&nbsp;%d\\n\",&nbsp;pid);\n&nbsp;&nbsp;&nbsp;&nbsp;}else{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"Error!\\n\");\n&nbsp;&nbsp;&nbsp;&nbsp;};\n&nbsp;&nbsp;&nbsp;&nbsp;for(;1;){\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;\n}\u003C\u002Fpre>\u003Cp>为了让程序不会运行结束自动退出我使用for死循环和sleep函数将程序阻塞，fork函数会创建一个进程，至於是否创建了进程我们看任务管理器的截图\u003C\u002Fp>\u003Cp>\u003Cimg src=\"\u002F\u002Fduguying.oss-cn-qingdao.aliyuncs.com\u002F2014\u002F9\u002F24\u002Ft1.png\" title=\"\" alt=\"t1.png\">\u003C\u002Fp>\u003Cp>任务管理器中有两个相同名称的进程了，这说明进程创建成功。 看终端运行结果\u003Cbr>&nbsp;\u003Cimg src=\"\u002F\u002Fduguying.oss-cn-qingdao.aliyuncs.com\u002F2014\u002F9\u002F24\u002Ft2.png\" title=\"\" alt=\"t2.png\">\u003C\u002Fp>\u003Cp>结果表明程序成功的创建了一个新进程。 fork()函数可以创建一个新进程并且返回子进程的ID，子进程与父进程完全一样，即执行相同的代码可是当子进程执行到fork()函数处的时候返回的值为0，却没有再创建进程；而父进程执行到fork()处创建了这个子进程并且返回了子进程的ID，至於为什么子进程不继续创建子子进程，这个我暂时就不知道了。 后来我又到fork()函数之前添加了一个printf作为标识，代码如下\u003C\u002Fp>\u003Cpre class=\"brush: cpp;\">#include&nbsp;&lt;stdio.h&gt;\nint&nbsp;main(void){\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;pid;\n&nbsp;&nbsp;&nbsp;&nbsp;printf(\"hello\\n\";);\n&nbsp;&nbsp;&nbsp;&nbsp;pid=fork();\n&nbsp;&nbsp;&nbsp;&nbsp;if(pid&gt;0){\u002F\u002F在父进程\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"Parents&nbsp;Process,&nbsp;The&nbsp;son&nbsp;pid:&nbsp;%d\\n\",&nbsp;pid);\n&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if(0==pid){\u002F\u002F在子进程\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"Son&nbsp;Process,&nbsp;The&nbsp;pid&nbsp;return:&nbsp;%d\\n\",&nbsp;pid);\n&nbsp;&nbsp;&nbsp;&nbsp;}else{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"Error!\\n\");\n&nbsp;&nbsp;&nbsp;&nbsp;};\n&nbsp;&nbsp;&nbsp;&nbsp;for(;1;){\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;\n}\u003C\u002Fpre>\u003Cp>运行，终端截图\u003C\u002Fp>\u003Cp>\u003Cimg src=\"\u002F\u002Fduguying.oss-cn-qingdao.aliyuncs.com\u002F2014\u002F9\u002F24\u002Ft3.png\" title=\"\" alt=\"t3.png\">\u003C\u002Fp>\u003Cp>图中并没有两行hello，这说明，如果子进程是完全复制父进程从代码的第一行开始执行的话子进程也会打印hello，很明显子进程不是这样干的。 再改代码，在fork函数之后添加printf，为了避开if分支就把printf函数添加到for阻塞代码的前一行[14]，代码如下\u003C\u002Fp>\u003Cpre class=\"brush: cpp;\">#include&nbsp;&lt;stdio.h&gt;\nint&nbsp;main(void){\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;pid;\n&nbsp;&nbsp;&nbsp;&nbsp;printf(\"hello\\n\");\n&nbsp;&nbsp;&nbsp;&nbsp;pid=fork();\n&nbsp;&nbsp;&nbsp;&nbsp;if(pid&gt;0){\u002F\u002F在父进程\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"Parents&nbsp;Process,&nbsp;The&nbsp;son&nbsp;pid:&nbsp;%d\\n\",&nbsp;pid);\n&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if(0==pid){\u002F\u002F在子进程\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"Son&nbsp;Process,&nbsp;The&nbsp;pid&nbsp;return:&nbsp;%d\\n\",&nbsp;pid);\n&nbsp;&nbsp;&nbsp;&nbsp;}else{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(\"Error!\\n\");\n&nbsp;&nbsp;&nbsp;&nbsp;};\n&nbsp;&nbsp;&nbsp;&nbsp;printf(\"world\\n\");\n&nbsp;&nbsp;&nbsp;&nbsp;for(;1;){\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;\n}\u003C\u002Fpre>\u003Cp>运行截图\u003C\u002Fp>\u003Cp>\u003Cimg src=\"\u002F\u002Fduguying.oss-cn-qingdao.aliyuncs.com\u002F2014\u002F9\u002F24\u002Ft4.png\" title=\"\" alt=\"t4.png\">\u003C\u002Fp>\u003Cp>是的，结果如我所料，有两个world，这说明fork后的进程并不是从头开始执行的，而是从fork语句处开始执行的。这不就是在fork函数那个点产生了一个分支吗。对于长期在github里面混的我，这让我想起了github项目管理里面的fork，看样子他们的表达是一样的，github的fork截图\u003C\u002Fp>\u003Cp>\u003Cimg src=\"\u002F\u002Fduguying.oss-cn-qingdao.aliyuncs.com\u002F2014\u002F9\u002F24\u002Ft5.png\" title=\"\" alt=\"t5.png\">\u003C\u002Fp>\u003Cp>你理解了fork吗？反正我是懂了……\u003C\u002Fp>",{"title":26,"list":27},"最热文章",[28,34,40,46,52,58,64,70,76,82],{"id":29,"title":30,"uri":31,"author":9,"created_at":32,"view_count":33},28,"docker容器目录与主机目录同步","\u002Farticle\u002Fdocker容器目录与主机目录同步","2014-12-31 12:34:08",15570,{"id":35,"title":36,"uri":37,"author":9,"created_at":38,"view_count":39},21,"beego中使用fis","\u002Farticle\u002Fbeego中使用fis","2014-12-03 10:47:56",9250,{"id":41,"title":42,"uri":43,"author":9,"created_at":44,"view_count":45},20,"用github登录，oauth开发","\u002Farticle\u002F用github登录，oauth开发","2014-11-23 13:33:37",9113,{"id":47,"title":48,"uri":49,"author":9,"created_at":50,"view_count":51},18,"windows服务注册工具nssm","\u002Farticle\u002Fwindows服务注册工具nssm","2014-10-31 21:34:39",9047,{"id":53,"title":54,"uri":55,"author":9,"created_at":56,"view_count":57},49,"用latex排版中文书籍","\u002Farticle\u002F用latex排版中文书籍","2016-10-31 11:12:02",8634,{"id":59,"title":60,"uri":61,"author":9,"created_at":62,"view_count":63},19,"texlive中文书签乱码","\u002Farticle\u002Ftexlive中文书签乱码","2014-11-15 02:54:01",8461,{"id":65,"title":66,"uri":67,"author":9,"created_at":68,"view_count":69},6,"Windows上的软件包管理器chocolatey","\u002Farticle\u002FWindows上的软件包管理器chocolatey","2014-08-10 15:55:22",8009,{"id":71,"title":72,"uri":73,"author":9,"created_at":74,"view_count":75},3,"利用开源和免费资源搭建CI环境","\u002Farticle\u002F利用开源和免费资源搭建CI环境","2014-07-04 16:54:58",7732,{"id":77,"title":78,"uri":79,"author":9,"created_at":80,"view_count":81},16,"php-fpm网站目录权限配置","\u002Farticle\u002Fphp-fpm网站目录权限配置","2014-10-18 01:36:10",7274,{"id":83,"title":84,"uri":85,"author":9,"created_at":86,"view_count":87},27,"sublime text 2插件开发，外部修改文件无法重新加载","\u002Farticle\u002Fsublime text 2插件开发，外部修改文件无法重新加载","2014-12-26 20:24:13",7054,{"title":89,"list":90},"按月归档",[91,95,98,101,104,107,110,114,118,121,124,127,131,134,137,141,144,147,150,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,218,221,224,227,230,233],{"title":92,"uri":93,"view_count":94},"2026年7月","\u002Farchive\u002F2026\u002F7\u002F1","[1]",{"title":96,"uri":97,"view_count":94},"2026年1月","\u002Farchive\u002F2026\u002F1\u002F1",{"title":99,"uri":100,"view_count":94},"2025年4月","\u002Farchive\u002F2025\u002F4\u002F1",{"title":102,"uri":103,"view_count":94},"2024年6月","\u002Farchive\u002F2024\u002F6\u002F1",{"title":105,"uri":106,"view_count":94},"2024年5月","\u002Farchive\u002F2024\u002F5\u002F1",{"title":108,"uri":109,"view_count":94},"2024年4月","\u002Farchive\u002F2024\u002F4\u002F1",{"title":111,"uri":112,"view_count":113},"2023年12月","\u002Farchive\u002F2023\u002F12\u002F1","[6]",{"title":115,"uri":116,"view_count":117},"2023年11月","\u002Farchive\u002F2023\u002F11\u002F1","[2]",{"title":119,"uri":120,"view_count":94},"2023年10月","\u002Farchive\u002F2023\u002F10\u002F1",{"title":122,"uri":123,"view_count":94},"2023年7月","\u002Farchive\u002F2023\u002F7\u002F1",{"title":125,"uri":126,"view_count":117},"2023年6月","\u002Farchive\u002F2023\u002F6\u002F1",{"title":128,"uri":129,"view_count":130},"2023年5月","\u002Farchive\u002F2023\u002F5\u002F1","[3]",{"title":132,"uri":133,"view_count":117},"2023年4月","\u002Farchive\u002F2023\u002F4\u002F1",{"title":135,"uri":136,"view_count":117},"2023年3月","\u002Farchive\u002F2023\u002F3\u002F1",{"title":138,"uri":139,"view_count":140},"2023年2月","\u002Farchive\u002F2023\u002F2\u002F1","[5]",{"title":142,"uri":143,"view_count":94},"2023年1月","\u002Farchive\u002F2023\u002F1\u002F1",{"title":145,"uri":146,"view_count":117},"2022年12月","\u002Farchive\u002F2022\u002F12\u002F1",{"title":148,"uri":149,"view_count":140},"2022年11月","\u002Farchive\u002F2022\u002F11\u002F1",{"title":151,"uri":152,"view_count":153},"2022年10月","\u002Farchive\u002F2022\u002F10\u002F1","[4]",{"title":155,"uri":156,"view_count":113},"2022年9月","\u002Farchive\u002F2022\u002F9\u002F1",{"title":158,"uri":159,"view_count":140},"2022年8月","\u002Farchive\u002F2022\u002F8\u002F1",{"title":161,"uri":162,"view_count":94},"2019年7月","\u002Farchive\u002F2019\u002F7\u002F1",{"title":164,"uri":165,"view_count":94},"2019年2月","\u002Farchive\u002F2019\u002F2\u002F1",{"title":167,"uri":168,"view_count":94},"2018年9月","\u002Farchive\u002F2018\u002F9\u002F1",{"title":170,"uri":171,"view_count":94},"2018年8月","\u002Farchive\u002F2018\u002F8\u002F1",{"title":173,"uri":174,"view_count":94},"2017年11月","\u002Farchive\u002F2017\u002F11\u002F1",{"title":176,"uri":177,"view_count":94},"2017年8月","\u002Farchive\u002F2017\u002F8\u002F1",{"title":179,"uri":180,"view_count":94},"2017年5月","\u002Farchive\u002F2017\u002F5\u002F1",{"title":182,"uri":183,"view_count":94},"2017年4月","\u002Farchive\u002F2017\u002F4\u002F1",{"title":185,"uri":186,"view_count":94},"2016年11月","\u002Farchive\u002F2016\u002F11\u002F1",{"title":188,"uri":189,"view_count":94},"2016年10月","\u002Farchive\u002F2016\u002F10\u002F1",{"title":191,"uri":192,"view_count":117},"2016年9月","\u002Farchive\u002F2016\u002F9\u002F1",{"title":194,"uri":195,"view_count":94},"2016年8月","\u002Farchive\u002F2016\u002F8\u002F1",{"title":197,"uri":198,"view_count":117},"2016年7月","\u002Farchive\u002F2016\u002F7\u002F1",{"title":200,"uri":201,"view_count":140},"2016年6月","\u002Farchive\u002F2016\u002F6\u002F1",{"title":203,"uri":204,"view_count":94},"2015年12月","\u002Farchive\u002F2015\u002F12\u002F1",{"title":206,"uri":207,"view_count":94},"2015年10月","\u002Farchive\u002F2015\u002F10\u002F1",{"title":209,"uri":210,"view_count":117},"2015年2月","\u002Farchive\u002F2015\u002F2\u002F1",{"title":212,"uri":213,"view_count":94},"2015年1月","\u002Farchive\u002F2015\u002F1\u002F1",{"title":215,"uri":216,"view_count":217},"2014年12月","\u002Farchive\u002F2014\u002F12\u002F1","[8]",{"title":219,"uri":220,"view_count":117},"2014年11月","\u002Farchive\u002F2014\u002F11\u002F1",{"title":222,"uri":223,"view_count":140},"2014年10月","\u002Farchive\u002F2014\u002F10\u002F1",{"title":225,"uri":226,"view_count":130},"2014年9月","\u002Farchive\u002F2014\u002F9\u002F1",{"title":228,"uri":229,"view_count":130},"2014年8月","\u002Farchive\u002F2014\u002F8\u002F1",{"title":231,"uri":232,"view_count":130},"2014年7月","\u002Farchive\u002F2014\u002F7\u002F1",{"title":234,"uri":235,"view_count":117},"2013年9月","\u002Farchive\u002F2013\u002F9\u002F1",{"url":237,"title":238},"https:\u002F\u002Fimage.duguying.net\u002F2022\u002F09\u002Fij6x8o4s.webp","老家 摄于2020年秋",1790062263398]