kefeiol 2016-04-03 04:28 采纳率: 100%
浏览 3380
已采纳

java 并发处理耗时操作的问题

刚刚写了个测试程序 原本想使用多线程并发处理 来节省时间,结果反而更耗时。请各位指点一下。
主方法:
public class MainAction {
public static void main(String[] args) {
/*new Action1().run();
new Action2().run();
new Action3().run();*/

    new Thread(new Action1()).start();
    new Thread(new Action2()).start();
    new Thread(new Action3()).start();
}

}
Action1 /2/3(方法一样,只是文件大小不同):
public class Action1 implements Runnable{

public void run() {
    System.out.println("start 1..........");
    long start1 = System.currentTimeMillis();
    writeToTxt("123");
    Context.flg1 = 1;
    long end1 = System.currentTimeMillis();
    float second1 = (end1 - start1) / 1000F;
    System.out.println("end 1 cost " + second1 + " s");
}
public void writeToTxt(String text){
    File file = new File("D:/1.txt");
    FileWriter fw = null;
    BufferedWriter writer = null;
    try {
        fw = new FileWriter(file);
        writer = new BufferedWriter(fw);
        for (int i=0;i<200*1000*10;i++) {
             writer.write(text);
             writer.newLine();//换行
        }
        writer.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch (IOException e) {
        e.printStackTrace();
    }finally{
        try {
            writer.close();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

}

运行结果:
start 1..........
start 2..........
start 3..........
end 2 cost 89.906 s
end 3 cost 115.905 s
end 1 cost 163.817 s

如果使用上面注掉的串行 运行:
start 1..........
end 1 cost 13.681 s
start 2..........
end 2 cost 18.752 s
start 3..........
end 3 cost 20.051 s

求解,是不是程序并没有真正的多线程去执行。
另外,如果Action1/2/3 是3个远程调用,能否达到节省时间的效果?

  • 写回答

1条回答 默认 最新

  • 毕小宝 博客专家认证 2016-04-03 05:01
    关注

    首先,你的代码没有问题,肯定是启动了3个线程来执行任务的。
    其次,分析下直接用main线程顺序执行三个操作,为什么比同时启动三个线程执行速度快呢?我认为这又可能跟操作系统处理IO的方式有关系,多线程并发处理IO时,操作系统底层响应IO的速度会影响线程的操作的。单线程环境下,顺序执行IO,操作系统可能不涉及到对IO请求的调用问题,但是多个线程同时发出IO请求命令时,操作系统底层的调度也有影响。
    你可以修正下你的测试内容,把Action中的Runnable的任务换成其他长时间计算任务,例如休眠操作,或者大数据计算操作,那么多线程的优势就体现出来了。
    修正测试内容:

        public void writeToTxt(String text) {
            int j=0;
            for(int i =0;i<1000000;i++){
             j=i    ;
            }
            System.out.println(Thread.currentThread().getName()+j);
        }
    

    最后,多线程提高效率体现在对整个功能完成时间上,是并行,而不会是纠结于单个任务完成过程中的处理时间;从理论上说,一个Runnable中执行完成的时间应该是差不多的,多线程的优势就是N个任务并行时,需要的总时间近似于完成一个任务的时间;而单线程时间则是N倍的单个任务的时间。而且多线程要考虑到线程池创建和调度的时间损耗,还是需要权衡的。像这种类似任务可以用java的线程池,可以免去线程创建和销毁的损耗。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退