比如我现在有个需求,这有n个规则,规则执行是向数据库选择的表导入数据的,每个规则可能耗时较长,依次点击这个规则进行执行。
请问,这个时候需不需要用到线程?这样的n可以有多少个?
我测试了下,不用线程,执行也都没问题啊,用new Thread().start() 也没啥区别,所以不懂了,问下

解决方案 »

  1.   

    一个效率的问题。依次点击来执行是串行执行,只有上一个任务或线程执行完了才能开启下一个任务或线程。而对数据库的操作是有IO操作的,在进行IO操作时cpu会等待当前线程的IO操作结束后才会继续执行当前线程的后续操作,效率很低。但如果你为每一个数据库操作都分配一个单独的线程去执行,那么在一个线程因IO操作进入阻塞时,cpu可以执行其他的线程,等之前线程IO结束后又继续执行之前的线程,效率会提高很多。
    使用场景的话,遍地都是吧,比如数据库连接池,比如典型的抢票实现等。现在基本不用自己写多线程的代码,都是使用别人写好的框架或者工具类。
      

  2.   

    假设你每个规则用时都是1h,有10个规则,
    那么你单线程执行就是 1->2->3->->9->10;//用时10h
    多线程执行,每个线程执行一个规则,每个线程 用时1h,因为同步执行所以项目总用时1h;
      

  3.   

    这个要具体问题具体分析的,创建线程和销毁线程也是要时间和开销的。如果你每个线程在很短的时间内就结束了,并且没有涉及到一些让CPU阻塞的操作,可能创行的效率就比并发的效率要高。当并发的数量越大,并发的效率与串行之间的效率就越明显。
      

  4.   

    这个要具体问题具体分析的,创建线程和销毁线程也是要时间和开销的。如果你每个线程在很短的时间内就结束了,并且没有涉及到一些让CPU阻塞的操作,可能创行的效率就比并发的效率要高。当并发的数量越大,并发的效率与串行之间的效率就越明显。我这没什么逻辑啊,就几个操作(往数据库不同表导数据)需要一个一个执行一下,就最简单的加入线程,请问是我这样写不行,那该怎么测试?
      

  5.   

    这个要具体问题具体分析的,创建线程和销毁线程也是要时间和开销的。如果你每个线程在很短的时间内就结束了,并且没有涉及到一些让CPU阻塞的操作,可能创行的效率就比并发的效率要高。当并发的数量越大,并发的效率与串行之间的效率就越明显。我这没什么逻辑啊,就几个操作(往数据库不同表导数据)需要一个一个执行一下,就最简单的加入线程,请问是我这样写不行,那该怎么测试?
    讲道理是这样写的,如果效果不明显的话,你增加数据库操作的次数试试。比如1000次,用个循环
      

  6.   

    这样做当然是不对的
    既然要分开执行 那么 那部分代码就要拆分出来(或者改变参数,最终让执行部分为n)例如int n = 10;
    for(int i=0;i<n;i++){
        System.out.println(n*n);//假设这行代码执行时间为1h,那么我整个程序执行下来就要10h
    }public class Tests extends Thread{


    public static void main(String[] args) throws IOException {
    int n = 10;
    for(int i=0;i<n;i++) {
    new Tests(i).start();//启动线程时间忽略不计  那么总共用时1h
    }
    }
    private int n;

    public Tests(int n) {
    this.n = n;
    }

    @Override
    public void run() {
    System.out.println(n*n);
    }

    }
      

  7.   

    这样做当然是不对的
    既然要分开执行 那么 那部分代码就要拆分出来(或者改变参数,最终让执行部分为n)例如int n = 10;
    for(int i=0;i<n;i++){
        System.out.println(n*n);//假设这行代码执行时间为1h,那么我整个程序执行下来就要10h
    }public class Tests extends Thread{


    public static void main(String[] args) throws IOException {
    int n = 10;
    for(int i=0;i<n;i++) {
    new Tests(i).start();//启动线程时间忽略不计  那么总共用时1h
    }
    }
    private int n;

    public Tests(int n) {
    this.n = n;
    }

    @Override
    public void run() {
    System.out.println(n*n);
    }

    }
    这个我清除,我现在是每点执行一次,它就启动一个线程,跟你这个应该一样吧?但是这样,耗时比单个执行完依次点击慢好多
      

  8.   

    不用连接池的话  jdbc  可以一个线程一个Connection,但是开多了会有问题,这个你自己把握吧,建议用连接池比较好
    多线程加连接池。
      

  9.   

    线程池加jdbc连接池吗?好的,我试试,多谢啦
      

  10.   

    而且不是线程越多越好,跟系统的cpu核数有关系
      

  11.   

    而且不是线程越多越好,跟系统的cpu核数有关系OK,谢了
      

  12.   

    典型的并发场景 :
    爬虫
    web服务器,tomcat/jetty等都使用了多线程业务处理不算,要并发写入单个数据库,并发多了以后,效率下降