文档章节

从多线程想到做有意义的编程

secondriver
 secondriver
发布于 2015/09/17 09:26
字数 1507
阅读 4
收藏 0

    写着各程序的意义在那里呢?

    很多时候我们写的代码都是没有意义的,比如重复的方法,重复的程序模块,同样的写法,相似的实习机制,测试都显得那样的时曾相识的等等。结果呢?很多代码都烂熟于胸了,而往后的日子中遇到相似的问题,很容易就稀里哗啦的就程序写完,然后有一种工作完成的成就感,轻松,愉悦,但是这样的编程意义在哪?

    自己也写了好多代码!很多时候有人会问一个程序员的代码量,10W行,20W行,或者问一个计算机专业的毕业生代码多少W行,更甚者在找工作时还要有有什么10W行代码量。看到就好笑,其实事实大伙都心知肚明的;圈子里流传这么一句:“工作20年的人,可能只有5年的经验;而工作5年的人,也可能有20年的经验”。

    说到这,大伙看一篇文章:技术人员,你拿什么拯救你的生活--温水煮青蛙

    看来这篇文章,感触还是很深的,我们的行业还处于社会主义初级阶段时期,还有很长的路要走,需要我们的努力好,思考,行动,改变。

    什么是有意义的编程呢?

    学习软件开发也有些日子了,代码写了不少,前不久将先前的程序全部删除掉了。还依稀记得当初的些许想法,这些程序留下来,等学到更多知识和技巧的时候可以拿来复读一下,或者改改。事实证明这个很不现实的想法。首先当初的代码没成体系,也就是说只是对知识点的测试,或者是一下小的程序,根本不值花时间在这上面;其次要做一个合格的开发这编码当然要有过硬的功力,但这还不是最重要的。软件的开发思想,对软件本身的理解和对软件开发的思考更为重要,需求分析,系统设计等等,所以说在时间的价值上不值得投入;最后呢!当初的编码没有长久的意义,那些代码的生命周期就是验证问题,当问题解决了,它的生命意义也就结束了。

   晚上看来下多线程就写了下面代码,主要实现文件的复制。


  
  1. package hj.xiao.filecopy; 
  2.  
  3. import java.io.BufferedInputStream; 
  4. import java.io.BufferedOutputStream; 
  5. import java.io.File; 
  6. import java.io.FileInputStream; 
  7. import java.io.FileNotFoundException; 
  8. import java.io.FileOutputStream; 
  9. import java.io.IOException; 
  10.  
  11. public class CopyThread implements Runnable { 
  12.  
  13.     // 源文件目录 
  14.     private File srcDir; 
  15.     // 目的文件目录 
  16.     private File dstDir; 
  17.  
  18.     // 构造方法,创建文件目录对象 
  19.     public CopyThread(String srcDir, String dstDir) { 
  20.         File srcTarget = new File(srcDir); 
  21.         File dstTarget = new File(dstDir); 
  22.         if (srcTarget.exists() && srcTarget.isDirectory()) { 
  23.             this.srcDir = srcTarget; 
  24.         } 
  25.         if (!dstTarget.exists()) { 
  26.             boolean bo = dstTarget.mkdirs(); 
  27.             if (bo) { 
  28.                 this.dstDir = dstTarget; 
  29.             } else { 
  30.                 String defaultPath = System.getProperty("user.dir"); 
  31.                 dstTarget = new File(defaultPath); 
  32.                 dstTarget.mkdirs(); 
  33.             } 
  34.         } 
  35.     } 
  36.  
  37.     // 实现Runnable接口 
  38.     @Override 
  39.     public void run() { 
  40.         copyFile(this.srcDir, this.dstDir); 
  41.     } 
  42.  
  43.     // 文件复制的实现方法 
  44.     private void copyFile(File src, File dst) { 
  45.         File[] fs = src.listFiles(); 
  46.         BufferedInputStream bis = null
  47.         BufferedOutputStream bos = null
  48.         if (fs.length == 0) { 
  49.             return
  50.         } 
  51.         byte[] bufs = new byte[1024 * 1024]; 
  52.         int size = 0
  53.         for (File f : fs) { 
  54.             if (f.isFile()) { 
  55.                 try { 
  56.                     bis = new BufferedInputStream(new FileInputStream(f)); 
  57.                     String dstPath = dst.getAbsolutePath() + File.separator 
  58.                             + f.getName(); 
  59.                     File dstFile = new File(dstPath); 
  60.                     boolean bo = dstFile.createNewFile(); 
  61.                     if (bo) { 
  62.                         bos = new BufferedOutputStream(new FileOutputStream( 
  63.                                 dstFile)); 
  64.                     } 
  65.                     while ((size = bis.read(bufs, 0, bufs.length)) != -1) { 
  66.                         bos.write(bufs, 0, size); 
  67.                     } 
  68.                     bis.close(); 
  69.                     bos.close(); 
  70.                 } catch (FileNotFoundException e) { 
  71.                     e.printStackTrace(); 
  72.                 } catch (IOException e) { 
  73.                     e.printStackTrace(); 
  74.                 } finally { 
  75.                     System.gc(); 
  76.                 } 
  77.             } else { 
  78.                 String dstPath = dst.getAbsolutePath() + File.separator 
  79.                         + f.getName(); 
  80.                 File dstFileDir = new File(dstPath); 
  81.                 if (!dstFileDir.exists()) { 
  82.                     boolean bo = dstFileDir.mkdirs(); 
  83.                     if (bo) { 
  84.                         copyFile(f, dstFileDir); 
  85.                     } 
  86.                 } 
  87.             } 
  88.         } 
  89.     } 

写一个主方法来测试:


  
  1. public static void main(String[] args) { 
  2.         String src0 = "D:" + File.separator + "摆渡恋人" + File.separator 
  3.                 + "Thread1"
  4.         String dst0 = "G:" + File.separator + "摆渡恋人" + File.separator 
  5.                 + "Thread1"
  6.         String src1 = "D:" + File.separator + "摆渡恋人" + File.separator 
  7.                 + "Thread2"
  8.         String dst1 = "G:" + File.separator + "摆渡恋人" + File.separator 
  9.                 + "Thread2"
  10.         Thread[] thread = new Thread[2]; 
  11.         CopyThread[] copy = new CopyThread[2]; 
  12.         copy[0] = new CopyThread(src0, dst0); 
  13.         copy[1] = new CopyThread(src1, dst1); 
  14.         thread[0] = new Thread(copy[0], "Thread Copy-" + 1); 
  15.         thread[1] = new Thread(copy[1], "Thread Copy-" + 2); 
  16.         thread[0].start(); 
  17.         thread[1].start(); 
  18.     } 

简简单单的测试一下,然后结果如图:

可以看到目的目录的属性信息和原目录的属性信息相同,文件复制成功。

     到这里这个程序的生命周期就结束了,意义了能说结束吗?

     当然可以说这个程序此时已经不具有什么意义了。

     程序员,我们不甘心,不应该就想到这里,看到这里就停止我们的思考呀!想想看:

     1.将文件复制的类封装起来,并增加文件处理过程信息,这样就可以把握我们的处理过程

     2.如果传人一个文件夹目录我们能否通过程序自动来识别该目录下的文件夹和文件,然后继续想,能不能通过设置一定的文件大小阀值来采用不同的机制实现文件复制;或者通过文件的大小范围来确定用指定的线程来处理,而不同的线程中的处理方法可以有不同的实现机制

     3.如果是桌面应用程序,能否继续实现断点式的复制

     4.接下来还有程序的设计,能够继续扩展而不做大的改动,能否封装后做到通用。

    等等,程序死了,人还要活着,还得为美好的明天活得更好,所以思考就不能停下来。

    回到上面的问题,有意义的编程,每个人都有自己的想法和思考,我觉得有意义的编程:

    首先:解放自己,远离代码苦工

    其次:不断质疑,不断实践,不断挑战未曾尝试的东西

    再次:解放别人,软件不会给用户带来技能力上的压力,体验上的反感。

    最后:珍惜自己的生命,时间如白驹过隙,韶华易逝,勤动手,多实践,做勤快的人,而不是辛劳的人;代码的意义也就融入了生活的意义当中。

本文出自 “野马红尘” 博客,谢绝转载!

© 著作权归作者所有

共有 人打赏支持
secondriver
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
最近想搞网络编程相关的技术.迷茫ing,想请教一些问题.

从事java工作两年了. 增删改查 业务性的东西都搞腻了.架构方面也了解一些,感觉现在还不是深入研究的时候,了解一下只是用来吹牛逼用的. 想脚踏实地从个人技术方面突破一下瓶颈, 搞搞能综合应用...

skr
2018/07/10
601
5
多线程的并发在Python中是一个美丽的梦

@廖雪峰 Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。多线程的并发在Python中就是一个美丽的梦 针对IO操作的多线程是有意义的,如果是CPU密集的多线程是没有意义的 求教...

mickelfeng
2017/02/08
317
1
他学习一年Python找不到工作,大佬都说你别再学Python了!

都说,滴水穿石非一日之功。然而有些人即使奋斗一辈子也比不上别人一年,别人学习一年比不得你学习一个月。其中缘由,有些人看了大半辈子还没看明白。 即使Python这么火,为何你学习一年的P...

柯西带你学编程
2018/06/06
0
0
请问大数据运维转开发需要补充哪些知识?

之前做了差不多三年的大数据运维开发,包括hadoop和spark集群等,工作中会使用python,shell写一些运维脚本,比较少会用到java。现在想应聘大数据开发的岗位。我上网搜了下大数据开发的岗位要...

雪地烟斗
2017/09/05
1K
5
校园招聘准备——求相关书籍推荐

校招要求中常有两种写法: 第一种:优秀的学习能力,对数据结构、算法分析、计算机系统结构、操作系统、网络等计算机基础具备扎实的功底; 第二种:熟悉网络编程和多线程编程,对TCP/IP,HTT...

楚兴
2015/01/29
346
4

没有更多内容

加载失败,请刷新页面

加载更多

泛型就这么简单

前言 从今天开始进入Java基础的复习,可能一个星期会有一篇的<十道简单算法>,我写博文的未必都是正确的~如果有写错的地方请大家多多包涵并指正~ 今天要复习的是泛型,泛型在Java中也是个很...

群星纪元
30分钟前
3
0
大数据提醒你:中国这些古建筑,可能是下一个巴黎圣母院!

大家晚上好,我是今天的提笔人嗅嗅。 巴黎圣母院失火事件让我的心情很沉重,一句无关痛痒的安慰“巴黎不哭”,已经不能表达我对这场文化之殇的惋惜之痛,人类伟大的建筑在一瞬间被毁灭。 世界...

forespider
42分钟前
0
0
mysql函数substring_index的用法

substring_index 按索引字符位进行截取字符串 substring_index(“待截取的字符串”,“截取数据依据的字符”,截取字符的位置N) 第三个参数可正,可负。正数表示索引字符前面的字符串,负数...

echojson
42分钟前
2
0
好程序员web前端分享用CSS和JS打造一个简单的图片编辑器

好程序员web前端分享用CSS和JS打造一个简单的图片编辑器,本文主要是利用CSS的 filter和简单的Jquery代码来实现一个简单的图片编辑器,包括对图片的透明度,黑白,图片亮度等调节。 CSS filt...

好程序员IT
51分钟前
2
0
浅析spring mvc的细节

spring mvc 整体结构 系统监听到请求 -> 通知tomcat -> 根据web.xml 通知相应的拦截器(spring mvc 通常指DispatcherServlet) --> 检查url是否有相匹配的请求实现 --> 拿到请求实现bean的适配...

最爱肉肉
53分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部