在看并发编程的时候发生了这么件事 就是之前就是弄个随机数 写到链表里 然后看用时多久
结果20w次。。卡了好久冥思苦想结果发现是不是线程频发建立所以导致的耗时过长
然后我看了看书 发现JDK1.5新加入了一个工具包叫java.util.concurren这里面有个这里有个线程池
我就用了用先上没用线程池的代码
package abc;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
public class test {
public static void main(String[] args) {
long time = System.currentTimeMillis();
final List<Integer> l =new LinkedList<Integer>();
final Random random =new Random();
for (int i=0; i<200000; i++){
Thread thread =new Thread(){
public void run(){
l.add(random.nextInt());
}
};
thread.start();
try{
thread.join();
}catch(InterruptedException e){
e.printStackTrace();
}
}
System.out.println(System.currentTimeMillis()-time);
System.out.println(l.size());
}
}
基本上耗时30秒左右
然后贴上用线程池的
package abc;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class pooltest {
public static void main(String[] args) {
long time = System.currentTimeMillis();
final List<Integer> l = new LinkedList<Integer>();
ExecutorService tp = Executors.newFixedThreadPool(50);
final Random ra = new Random();
for (int i = 0; i < 200000; i++) {
tp.execute(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
synchronized (l) {
l.add(ra.nextInt());
}
}
}
);
}
tp.shutdown();
try {
tp.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println(System.currentTimeMillis() - time);
System.out.println(l.size());
}
}
结果发现只需要 0.2秒
性能差好多啊!
不过用线程池的时候会有个毛病。。
就是本来20w次 他总会少几百 或者几千我一直没搞明白咋回事后来看书才知道
会有并发的问题就是俩线程同时像链表中放 一个放进去了 另外一个就失效了所以会少
这时候需要把放那个动作 加锁 让线程访问L的时候只能有一个线程放 这样就解决了~~