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的更多相关文章

  1. Java多线程——ThreadLocal类的原理和使用

    Java多线程——ThreadLocal类的原理和使用 摘要:本文主要学习了ThreadLocal类的原理和使用. 概述 是什么 ThreadLocal可以用来维护一个变量,提供了一个ThreadLo ...

  2. [Java多线程]-ThreadLocal源码及原理的深入分析

    ThreadLocal<T>类:以空间换时间提供一种多线程更快捷访问变量的方式.这种方式不存在竞争,所以也不存在并发的安全性问题. //-------------------------- ...

  3. Java多线程ThreadLocal介绍

    在Java多线程环境下ThreadLocal就像一家银行,每个线程就是银行里面的一个客户,每个客户独有一个保险箱来存放金钱,客户之间的金钱不影响. private static ThreadLocal ...

  4. java多线程--定时器Timer的使用

    定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术. Time类主要负责完成定时计划任务的功能,就是在指定 ...

  5. Java多线程——ThreadLocal类

    一.概述   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名 ...

  6. 深入理解Java多线程——ThreadLocal

    目录 定义 API 场景分析 场景实验,观察Spring框架在多线程场景的执行情况 10000此请求,单线程 10000次请求,线程数加到100 对c的访问加锁 把c设为ThreadLocal 收集多 ...

  7. Java多线程系列七——ExecutorService

    java.util.concurrent.ExecutorService接口提供了许多线程管理的方法 Method 说明 shutdown 拒绝接收新的任务,待已提交的任务执行后关闭,且宿主线程不阻塞 ...

  8. JAVA多线程---ThreadLocal<E>

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px ".SF NS Text" } tips: 1 当前ThreadLocal ...

  9. java多线程-ThreadLocal

    大纲: 用法 源码 一.用法 ThreadLocal是一个容器,顾名思义就是把一个变量存到线程本地. class Test { public static void main(String[] arg ...

随机推荐

  1. Git入门操作(一)

    最近真正用到了Git,感觉还是需要好好整理一下最最基础用法,与萌新共享.^_^ 关于Git的基础介绍,这里不再赘述,下面撸代码了(主要是命令行的操作,属于linux操作系统的,可能没听过,但记住就好了 ...

  2. 《Java多线程编程实战指南(核心篇)》阅读笔记

    <Java多线程编程实战指南(核心篇)>阅读笔记 */--> <Java多线程编程实战指南(核心篇)>阅读笔记 Table of Contents 1. 线程概念 1.1 ...

  3. 在EF中使用SQL执行简单高效的增删查操作

    随着平台数据的积累,对于数据访问的速度要求愈来愈高.优化后台访问性能,将是之后的一个重点任务. 但是,后台在项目开发初期采用的是Abp(Lite DDD)框架,集成EnityFramework.因为之 ...

  4. 4.用IntelliJ IDEA 创建Maven Web

    一.File→New→ Project 二.Maven→org.apache.maven.archetypes:maven-archetype-webapp→Next(记得打钩) 三.填入后Next→ ...

  5. Python库的安装方式

    Python库的安装方式 1.Python库的自定义安装——找到相应网站,下载安装 示例:pywin32库安装 .exe,直接双击,自动识别安装目录 安装就可以了. 载入成功 2.Python库的工具 ...

  6. Pytest系列(5) - 用例执行的几种状态

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 用例执行状态 用例执行完成后,每条 ...

  7. 360网络安全学习笔记——SQLmap

    SQLmap简介 SQLmap是一个开源的自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞. SQL注入模式 1.基于布尔的盲注 2.基于时间的盲注 3.基于报错注入 ...

  8. Java 配 Shell 等于美酒加咖啡

    化学中我们得知「氢气加氧气在点燃的情况下会生成水」. 生活中我们得知「良辰加美景的情况下会得到千金春宵一刻」. 技术上又何尝不是如此呢?先假设一个场景:BOSS 让你实现一个服务监控的指挥室,能看到每 ...

  9. Appium自动化 - 设置unicodeKeyboard: True运行脚本后,手机输入时无法调出软键盘

    问题背景 做appium自动化的时候,使用了UiAutomator1驱动,然后设置了UnicodeKeyboard 执行自动化脚本之后,玩手机的时候发现平时用的输入法键盘没法调出来了 'automat ...

  10. SpringCloud(三)之我学 Hystrix

    1.断路器 在消费服务的启动类,添加注解:@EnableCircuitBreaker,在消费服务的调用类上,添加注解:@HystrixCommand(fallbackMethod = "&q ...