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 ...
随机推荐
- Array.forEach原理,仿造一个类似功能
Array.forEach原理,仿造一个类似功能 array.forEach // 设一个arr数组 let arr = [12,45,78,165,68,124]; let sum = 0; // ...
- LeetCode#1047-Remove All Adjacent Duplicates In String-删除字符串中的所有相邻重复项
一.题目 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们. 在 S 上反复执行重复项删除操作,直到无法继续删除. 在完成所有重复项删除操作后返回最终的字符串.答案 ...
- Python数据库之数据库基本操作
安装(基于centos) yum -y install mariadb mariadb-server # centos7版本 yum -y install mysql mysql-server #ce ...
- 【cs224w】Lecture 6 - 消息传递 及 节点分类
目录 Node Classification Probabilistic Relational Classifier Iterative Classification Belief Propagati ...
- JavaScript RegExp.$1...$9 属性详解
RegExp.$1...$9属性用于返回正则表达式模式中某个子表达式匹配的文本. 正则表达式中每个小括号内的部分表达式就是一个子表达式. 该属性是RegExp全局对象的一个只读属性,所有主流浏览器均支 ...
- mpvue中使用flyjs全局拦截
mpvue全局属性设置,在我之前的文章中有介绍,今天想记录的就是怎么和Fly.js结合使用来实现全局拦截功能: 首先我们要安装好Flyio,在mpvue项目中我们用npm下载安装: npm insta ...
- python 爬虫之 urllib库
文章更新于:2020-03-02 注:代码来自老师授课用样例. 一.初识 urllib 库 在 python2.x 版本,urllib 与urllib2 是两个库,在 python3.x 版本,二者合 ...
- 让 .NET 轻松构建中间件模式代码
让 .NET 轻松构建中间件模式代码 Intro 在 asp.net core 中中间件的设计令人叹为观止,如此高大上的设计何不集成到自己的代码里呢. 于是就有了封装了一个简单通用的中间件模板的想法, ...
- 对称加密算法在C#中的踩坑日常
前言 有幸接触了一下传说中的对称加密算法3DES 感觉这些加密算法与我的工作是想去甚远的,一般没什么机会接触这些东西 今次了解了一下3DES这个对称算法 原理算不上明白,算是踩了C#中的一些坑吧 C# ...
- 原生js俄罗斯方块
效果图 方块定位原理通过16宫格定位坐标,把坐标存到数组中去 [ [[2,0],[2,1],[2,2],[1,2]],//L [[1,1],[2,1],[2,2],[2,3]], //左L [[2,0 ...