上次的java多线程问题的拓展

看了一下Java并发编程实战之后,感觉有必要试一试里面的知识点。

上次是直接开启线程,这次尝试换用java.util.concurrent包来实现多线程编程。

 

一、先上代码

testThread.java

1.一些简单的解释

Callable接口有点类似于开启Thread中的类,需要实现一个call()方法。方法里就写需要并发的逻辑。

这里的:

其实等同于新建一个线程类,只不过实现的接口不一样而已:

hander.java

ExecutorService开启一个线程池,通过newFixedThreadPool()方法来指定要开多少条线程(至于开多少条比较适合,下面将会提到)。

Future接口可以用来取Callable执行后的结果。

2.我个人的编程思路如下:

首先确认我们要干什么(要往数据库里插入10000条数据),那么要并发的部分就是插入数据的操作(这里用syso代替)。所以先声明Callable接口,实现call方法,将要并发的逻辑写在里面:

因为要保证并发下的线程安全,计数需要使用线程安全类(上次已经提到了)。

既然需要并发,就要开启一个线程池:

因为需要拿到并发时线程执行的结果,所以需要定义一个future接口

只要还有数据没插入(小于10000),那么就提交一次handler,由线程池中的线程认领执行:

养成良好习惯,执行完毕后关闭线程池(我个人觉得写在finally块中比较好)。

二、开启多少线程比较好?

这是一个问题,我查了一下,基本上都认为,由具体业务和硬件情况共同决定,没有比较硬性的规定。

但是也有这样的说法:线程数<=cpu数

来自:https://www.zhihu.com/question/28186782

既然需要根据具体机器的cpu数来开启线程,那么就要想办法获取cpu数,java这样获取即可:

三、总结

java.util.concurrent包值得深究。

发表评论

电子邮件地址不会被公开。 必填项已用*标注