`
cq520
  • 浏览: 166190 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java多线程应用开发(二),多线程,让人欢喜让人忧

阅读更多

       多线程开发不仅提升了了程序执行的效率,更是大大解决了单线程中所无法解决的同步问题,那么多线程开发是不是真的像我们想象的那么完美呢?

       最近两个星期一直在做多线程开发,期间用多线程达到了许多还算nice的效果,但是同时,也出现了许多新的问题,下面简单的分析了一下:

1.  线程创建是否越多越好?怎么样提高效率?

举一个多线程搜索的例子,写一个搜索文件后缀的方法:

publicvoid searchSuffix(String suffix,String directory){

       //搜索指定路径的文件夹

       File dir=new File(directory);

       if(dir.exists()){

           if(dir.isFile()&&dir.getName().startsWith(suffix)){

              System.out.println(dir.getAbsolutePath());

           }

           if(dir.isDirectory()){

              File files[]=dir.listFiles();

              int length=files.length;

              for(int i=0;i<length;i++){

                  //如果是以指定头文件开头的话,就输出文件的绝对路径

                  if(files[i].getName().endsWith(suffix)){

                     System.out.println(files[i].getAbsolutePath());

                  }

                  //如果仍然是一个目录

                  if(files[i].isDirectory()){

                     //递归搜索该文件夹下面的文件

                     searchSuffix(suffix,files[i].getAbsolutePath());

                  }

              }

           }

       }

       else{

           System.out.println("路径不存在");

       }

}

使用普通的单线程搜索时,搜索文件的方法是线性的,而且每搜索完一层目录才能继续搜索下一层的目录,这样程序执行的效率肯定不是很高。一个简单的方法就是同时搜索该文件夹下面的第一层目录,这样能够线性的提高程序的执行效率,例如,如果一个文件夹第一层下面有五个文件夹,那么就同时搜索这五个文件夹,效率提高将达到小于五倍的效果(线程创建需要开销)。同时,问题也就出现了,如果文件夹下面依然是单个文件夹,那么这个做法就没有意义了。在这种情况下我曾想到一个比较极端的做法,递归的创建线程搜索,为每一个文件夹都创建一个线程来搜索该目录下的文件,因为在一般情况下,主文件夹下面的所有文件夹的数量一般比文件的数量要少得多,不过实际情况并不像想象中的那么美妙。做一道简单的计算题来证明一下:

假设创建一个线程的时间开销相当于搜索五个文件的时间,多线程执行速度与单线程呈小于简单logn的关系,递归算法执行没有时间浪费,那么在一般的文件夹下,文件的数量超出文件夹数量的五倍还是极有可能的,但是我们在递归的时候却没有考虑到程序判断也需要时间,执行判断语句无疑就将线程的创建时间开销增加了大于一倍,由于线程越多,每一个线程执行的速度肯定也没有单线程执行的速度要快,那么文件数量至少要达到文件夹数量的二十倍以上才会节约时间。听到这里你肯定会觉得,随便一个文件夹里面的文件还是很有可能超越文件夹的二十倍呀?但是我们没有考虑过在超越一百个线程之后,这种理想的情况是否还会成立,或者实际上,线程过多早已导致你的程序溢出了栈空间。

有问题才会新的发现,千万不要把多线程当做提高运行效率的万灵药,过多的线程不仅会导致程序溢出栈空间,而且系统开销也是相当之大。有一个比较经典的问题是如何让自己的CPU使用率达到100%,在单核系统之下只用几行代码就可以实现(有兴趣的可以尝试一下),而我一直以为自己的四核电脑是不会那么轻易被“玩死”的,结果那天在多线程编程里面调用了URL资源之后,CPU瞬间就被“玩死“了,这一点至今倒成了我比较有成就感的一件事。

      

2.如何让线程听你指挥?

多线程编程的时候,经常遇到的问题还有如何控制线程的挂起,合理的创建程并控制线程的运行与停止状态可以达到许多nice的效果。

java6以后Thread类里面的暂停(suspend,停止(stop)与重启(resume)方法已经过时,原因是这些方法都有死锁倾向,如果使用这些方法导致的结果很有可能就是线程的确是停止了,但是却再也启动不起来了,这个时候这个线程也就报废了,那么怎么控制线程的执行与停止呢?我们可以使用如下的方法,也能达到预期的效果哦:

publicclass MyThread extends Thread{

    booleanisStop=false;//判断线程是否停止

    booleanisPause=false;//判断线程是否停止

    publicvoid run(){

       while(!isStop){//如果没停止

           while(!isPause){//如果没暂停

             

           }

       }

    }

}

到时候我们只要通过改变isStopisPause的值就可以控制线程是否执行了,是不是很方便呢?

多线程开发还有很多值得挖掘的地方,有时候用其解决的问题确实让人兴奋,不过其中带来的麻烦却也不少,这么说来,多线程有些时候倒还真像一位美丽的女子,让人欢喜让人忧,当然,这样的比喻倒不是太恰当,期待更多的发现。

分享到:
评论

相关推荐

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程应用实现示例

    在Java编程语言中,多线程是其核心特性之一,它允许程序同时执行多个任务,提高了应用程序的效率和响应性。本示例着重探讨如何在Java中实现多线程,并通过一个具体的小球运动模拟来阐述相关概念。 一、多线程基础 ...

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。...在实际开发中,正确地应用多线程机制可以显著提升程序的性能和用户体验。

    Java多线程与并发库高级应用

    并发库高级应用\多线程\Java

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    Java多线程的简单应用

    本示例可能是一个Applet,Applet是Java小程序,它可以在Web浏览器中运行,展示了如何在Java环境中应用多线程。 首先,我们要理解线程的基本概念。线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机...

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    java多线程分页查询

    #### 二、Java多线程分页查询原理及实现 ##### 1. 分页查询基础概念 分页查询是指在查询数据时,将数据分成多个页面展示,而不是一次性返回所有数据。这种方式能够有效地减少单次查询的数据量,从而提高查询速度和...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    深入浅出 Java 多线程.pdf

    多线程编程有很多应用场景: 1. 网络编程:多线程编程可以用于网络编程,以提高网络程序的执行效率和响应速度。 2. 图形用户界面编程:多线程编程可以用于图形用户界面编程,以提高图形用户界面的响应速度。 3. ...

    汪文君JAVA多线程编程实战(完整不加密)

    这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是并发处理的基础,对于构建高效、可扩展的系统至关重要。 Java多线程允许程序同时执行多个独立的代码...

    Java多线程技术及其在网络编程中的应用.pdf

    特别值得注意的是,Java原生支持多线程机制,这为开发高性能的网络应用提供了坚实的基础。本文将详细介绍Java的多线程技术,并通过一个具体的案例——多用户在线聊天室的开发——展示如何在网络编程中运用这一技术。...

    java多线程查询数据库

    在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....

    java 多线程并发实例

    本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆...

    java多线程处理数据库数据

    在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...

    多线程启动.java多线程启动.java多线程启动.java

    多线程启动.java多线程启动.java多线程启动.java多线程启动.java

    java多线程应用实战

    多线程在实际开发中有着举足轻重的作用,但在教科书中并没有学到,本文以mysql(支持任何数据库)插入数据和查询数据为例子,讲述了如何在几秒钟内疯狂插入几十万数据,在一个方法中如何同时运行多条SQL语句(效率比...

Global site tag (gtag.js) - Google Analytics