Java 多线程--ThreadLocal Timer ExecutorService
ThreadLocal
/**
* ThreadLocal:每个线程自身的存储本地、局部区域
* @author xzlf
*
*/
public class ThreadLocalTest01 {
// private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
// 更改初始化值
/*private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
protected Integer initialValue() {
return 100;};
};*/
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>().withInitial(()->50);
public static void main(String[] args) {
// 获取
System.out.println(Thread.currentThread().getName() +"-->" + threadLocal.get());
// 设置
threadLocal.set(200);
System.out.println(Thread.currentThread().getName() +"-->" + threadLocal.get());
}
}
**
* ThreadLocal:每个线程自身的数据,更改不会影响其他线程
* @author xzlf
*
*/
public class TheadLocalTest02 {
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>().withInitial(()->1);
public static void main(String[] args) {
for(int i=0; i<5; i++) {
new Thread(new MyRun()).start();
}
}
public static class MyRun implements Runnable{
@Override
public void run() {
int left = threadLocal.get();
System.out.println(Thread.currentThread().getName() + "得到了-->" + left);
threadLocal.set(left - 1);
System.out.println(Thread.currentThread().getName() + "还剩下-->" + threadLocal.get());
}
}
}
/**
* ThreadLocal:分析上下文 环境 起点
* 1、构造器: 哪里调用 就属于哪里 找线程体
* 2、run方法:本线程自身的
* @author xzlf
*
*/
public class TheadLocalTest03 {
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
protected Integer initialValue() {
return 100;
};
};
public static void main(String[] args) {
new Thread(new MyRun()).start();
new Thread(new MyRun()).start();
}
static class MyRun implements Runnable{
public MyRun() {
threadLocal.set(200);
System.out.println(Thread.currentThread().getName() + "-->" + threadLocal.get());
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "-->" + threadLocal.get());
}
}
}
运行:

/**
* InheritableThreadLocal:继承环境上下文的数据,拷贝一份给子线程
*
* @author xzlf
*
*/
public class TheadLocalTest04 {
private static ThreadLocal<Integer> threadLocal = new InheritableThreadLocal<Integer>();
public static void main(String[] args) {
threadLocal.set(2);
System.out.println(Thread.currentThread().getName()+"-->"+threadLocal.get());
new Thread(()-> {
System.out.println(Thread.currentThread().getName() + "-->" + threadLocal.get());
threadLocal.set(100);
System.out.println(Thread.currentThread().getName() + "-->" + threadLocal.get());
}).start();
}
}
运行:

ExcutorService
线程池
public class TestFutrueTask {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 创建任务
MyCall call = new MyCall();
// 交给任务管理器
FutureTask<String> task = new FutureTask<String>(call);
// 创建代理类并启动线程
new Thread(task).start();
System.out.println("获取结果-->" + task.get());
System.out.println("任务是否执行完成-->" + task.isDone());
}
}
线程池执行带返回值的callable时需要加入到集合中,避免get() 等待结果是阻塞
package com.xzlf.testThread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
public class TestPool2 {
public static void main(String[] args) throws Exception, Exception {
// 创建一个线程池,线程池中只有一个线程对象
// ExecutorService pool = Executors.newSingleThreadExecutor();
// 创建一个线程池,线程池中数量固定
ExecutorService pool = Executors.newFixedThreadPool(10);
// 创建一个线程池,线程池中数量可以动态改变
// ExecutorService pool = Executors.newCachedThreadPool();
List<Future<Integer>> list = new ArrayList<Future<Integer>>();
/**使用线程池执行大量的Callable任务*/
for (int i = 0; i < 20; i++) {
Callable<Integer> command = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
Thread.sleep(2000);
return (int) (Math.random()*10);
}
};
// 将任务交给线程池
FutureTask<Integer> task =(FutureTask<Integer>) pool.submit(command);
list.add(task);
// pool.execute(task);
// System.out.println(task.get());
}
System.out.println("ok?");
for (Future<Integer> f : list) {
System.out.println(f.get());
}
System.out.println("ok!");
pool.shutdown();
}
}
运行:

Timer
package com.xzlf.testThread;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TestTimer {
public static void main(String[] args) throws InterruptedException {
// 创建Timer对象
Timer timer = new Timer();
// 创建任务对象
TimerTask task = new Clock();
// 调用schedule()方法执行任务
timer.schedule(task, new Date(System.currentTimeMillis() + 2000), 1000);
Thread.sleep(5000);
timer.cancel();
}
}
/**
* 任务
* @author xzlf
*
*/
class Clock extends TimerTask{
DateFormat df = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");
@Override
public void run() {
Date date = new Date();
String dateStr = df.format(date);
System.out.println(dateStr);
}
}
运行:

Java 多线程--ThreadLocal Timer ExecutorService的更多相关文章
- Java多线程——ThreadLocal类的原理和使用
Java多线程——ThreadLocal类的原理和使用 摘要:本文主要学习了ThreadLocal类的原理和使用. 概述 是什么 ThreadLocal可以用来维护一个变量,提供了一个ThreadLo ...
- [Java多线程]-ThreadLocal源码及原理的深入分析
ThreadLocal<T>类:以空间换时间提供一种多线程更快捷访问变量的方式.这种方式不存在竞争,所以也不存在并发的安全性问题. //-------------------------- ...
- Java多线程ThreadLocal介绍
在Java多线程环境下ThreadLocal就像一家银行,每个线程就是银行里面的一个客户,每个客户独有一个保险箱来存放金钱,客户之间的金钱不影响. private static ThreadLocal ...
- java多线程--定时器Timer的使用
定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术. Time类主要负责完成定时计划任务的功能,就是在指定 ...
- Java多线程——ThreadLocal类
一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名 ...
- 深入理解Java多线程——ThreadLocal
目录 定义 API 场景分析 场景实验,观察Spring框架在多线程场景的执行情况 10000此请求,单线程 10000次请求,线程数加到100 对c的访问加锁 把c设为ThreadLocal 收集多 ...
- Java多线程系列七——ExecutorService
java.util.concurrent.ExecutorService接口提供了许多线程管理的方法 Method 说明 shutdown 拒绝接收新的任务,待已提交的任务执行后关闭,且宿主线程不阻塞 ...
- JAVA多线程---ThreadLocal<E>
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px ".SF NS Text" } tips: 1 当前ThreadLocal ...
- java多线程-ThreadLocal
大纲: 用法 源码 一.用法 ThreadLocal是一个容器,顾名思义就是把一个变量存到线程本地. class Test { public static void main(String[] arg ...
随机推荐
- nodejs 配置代理服务器
const express = require('express'); const proxy = require('http-proxy-middleware'); const cors = req ...
- 【Pytest03】全网最全最新的Pytest框架fixture应用篇(1)
fixtrue修饰器标记的方法通常用于在其他函数.模块.类或者整个工程调用时会优先执行,通常会被用于完成预置处理和重复操作.例如:登录,执行SQL等操作. 完整方法如下:fixture(scope=' ...
- WeChat-SmallProgram:如何定义一个组件
创建组件所需的文件: 1.在根目录创建 Componet 文件夹 2.再创建一个select文件夹 3.然后:右键这个文件夹,新建下面的这个 Component.然后输入需要创建的名称,我这里为了方便 ...
- flask操作数据库 以及 建表
创建迁移仓库 首先,安装Flask-Migrate: pip install flask-migrate 将app项目注册,便于使用orm操作 from flask_sqlalchemy import ...
- Java刷题知识点总结
1,方法的重写(override)两同两小一大原则: 方法名相同,参数类型相同 子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类方法访问权限. ...
- 直播回顾 | IOT、AI、云计算等融合技术推进制造业产业转型(二)
3月31日,BoCloud博云.京东智联云.海尔集团联手,以“制造”到“智造”为主题,进行了IT赋能企业数字化转型实践分享. 博云售前解决方案架构师尹贺杰,京东云与AI企业云业务部高级业务技术经理吴世 ...
- Three.js 中的参数调试控制插件dat.GUI.JS - [Three.js] - [dat.GUI]
不论是处于特殊功能的需要,还是处于效果调试方便,我们可能都需要修改模型中的参数值.在Three.js中,谷歌提供了一个js库,即dat.GUI.js用于处理这种需求. 通过该库,我们就不需要通过手动修 ...
- 1054 The Dominant Color (20分)(水)
Behind the scenes in the computer's memory, color is always talked about as a series of 24 bits of i ...
- 多转一ETH(ERC20代币汇集)
1.下载表格模板 2.导入小号地址 NO1.地址整理 NO2.地址导入 NO3.导入完成 3.查询地址余额1.下图是汇集ETH的操作图片 2.下图是汇集ERC20代币的操作图片 注 ...
- go For-range结构
For结构: for 初始化;条件语句;修饰语句{ 输出 } 一.For-range结构是可以怎么用? 这种构建方法可以应用于数组和切片: for ix, value := range slice1 ...