ThreadLocal
顾名思义,本地线程,虽然使用的是同一个变量, 但是在不同的线程里面,每个线程之间的变量数据不同享,彻底隔离数据,
ThreadLocal底层原理
其实就是在每个线程的本地内存里面建一个map,把值放到这个map中,详细代码如下:

线程池
四种线程池
1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
示例如下
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "---" + index);
}
});
2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
// 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
final ExecutorService newCachedThreadPool = Executors.newFixedThreadPool(3);
newCachedThreadPool.execute(new Runnable() {
public void run() {
System.out.println("i:" + index);
}
});
3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
// 创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(5);
newScheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);
4、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级);
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
newSingleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println("index:" + index);
}
});
线程池的另一种用法,并发执行, tasklist 中的所有代码执行完毕后才会继续后面的代码执行
// // 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
ExecutorService executorService = Executors.newFixedThreadPool(3);
//添加并行执行的代码
List<Callable<Object>> taskList = new ArrayList<Callable<Object>>();
taskList.add(new Callable<Object>() {
public Object call(){
System.out.println("我运行了");
return "hello";
}
});
taskList.add(new Callable<Object>() {
public Object call(){
System.out.println("我也运行了");
return "would !";
}
});
// 如果线程池执行时间超时会抛出CancellationException 异常,因此设置为不限制时长
List<Future<Object>> futures = executorService.invokeAll(taskList);
// List<Future<Object>> futures = executorService.invokeAll(taskList,3000,TimeUnit.MILLISECONDS);
for(Future item : futures){
// 循环取值,如果有异常抛出,不循环执行的话,异常会被线程吃掉,有错误也不知道了
item.get();
}
//关闭并存线程池
executorService.shutdown();
|