package com.imooc.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test4 {
public static ExecutorService threadPool= Executors.newFixedThreadPool(10);
public String date(int num){
StringBuilder stringBuilder=ThreadSafeStringBuilder.stringBuilderThreadLocal.get();
stringBuilder.append("数字:"+num);
String s= stringBuilder.toString();
return s;
}
public static void main(String[] args) {
for(int i=0;i<20;i++){
int s=i;
threadPool.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
String num = new Test4().date(s);
System.out.println(num);
}
});
}
threadPool.shutdown();
}
}
class ThreadSafeStringBuilder{
public static ThreadLocal<StringBuilder> stringBuilderThreadLocal=
new ThreadLocal<StringBuilder>(){
@Override
protected StringBuilder initialValue() {
return new StringBuilder();
}
};
}
运行结果为什么9之后的显示的是双结果呢?怎么造成的哎
线程池设置10个,超过10个后会复用之前的线程,你创建StringBuilder的方式应该是根据当前线程创建的
所以当线程复用时,StringBuilder用的是上一次创建的,里面已有上次创建的内容了
你这个结果运行的是正确的,因为你每个线程执行了2遍数字输出。StringBuilder是追加。
你可以在获取本地遍量的下面把当前线程的本地变量清空stringBuilder.setLength(0)