廖雪峰Java11多线程编程-4线程工具类-1ThreadLocal

class User{
    String name;
    int level;
    public User(String name, int level){
        this.name = name;
        this.level = level;
    }
}
class UserContext implements AutoCloseable{
    static final ThreadLocal<User> context = new ThreadLocal<>();
    public static User getCurrentUser(){
        return context.get();
    }
    public UserContext(User user){
        context.set(user);
    }
    public void close(){
        context.remove();
    }
}
class ProcessThread extends Thread{
    User user;
    ProcessThread(User user){
        this.user = user;
    }
    public void run(){
        try(UserContext ctx = new UserContext(user)){
            new Greeting().hello();
            Level.checkLevel();
        }
    }
}
class Greeting{
    void hello(){
        User user = UserContext.getCurrentUser();
        System.out.println("Hello,"+user.name+"!");
    }
}
class Level{
    static void checkLevel(){
        User user = UserContext.getCurrentUser();
        if(user.level>100){
            System.out.println(user.name+" is a VIP user.");
        }else{
            System.out.println(user.name+" is a registered user.");
        }
    }
}
public class Main{
    public static void main(String[] args) throws Exception{
        Thread t1 = new ProcessThread(new User("Bob",120));
        Thread t2 = new ProcessThread(new User("Alice",80));
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("Main end");
    }
}

原文地址:https://www.cnblogs.com/csj2018/p/11047825.html

时间: 2024-10-09 09:20:41

廖雪峰Java11多线程编程-4线程工具类-1ThreadLocal的相关文章

廖雪峰Java11多线程编程-2线程同步-2synchronized方法

1.Java使用synchronized对一个方法进行加锁 class Counter{ int count = 0; public synchronized void add(int n){ count += n; } public synchronized void dec(int n){ count -= n; } public int get(){//读取一个int类型是原子操作,不需要同步 return count; } } class AddThread extends Thread

廖雪峰Java11多线程编程-3高级concurrent包-5Atomic

Atomic java.util.concurrent.atomic提供了一组原子类型操作: 如AtomicInteger提供了 int addAndGet(int delta) int incrementAndGet() int get() int compareAndGet() Atomic类可以实现: 无锁(lock-free)实现的线程安全(thread-safe)访问 原理:CAS(Compare and Set)如果AtomicInteger实例的值是prev,就替换为next,返回

廖雪峰Java11多线程编程-3高级concurrent包-1ReentrantLock

线程同步: 是因为多线程读写竞争资源需要同步 Java语言提供了synchronized/wait/notify 编写多线程同步很困难 所以Java提供了java.util.concurrent包: 更高级的同步功能 简化多线程程序的编写 JDK>= 1.5 java.util.locks.ReetrantLock用于替代synchronized加锁 ```#java synchronized(lockObj){ n = n + 1; } final Lock lock = new Reetra

Java多线程及JDK5线程工具类总结

内容摘抄来自:传智播客 张孝祥 老师的<Java高新技术>视频,   并加入了个人总结和理解. 虽然我没有参加过任何培训班,但我很大一部分知识都来自于传智播客的网络分享视频. 十分真挚的感谢张老师的公开视频. 1.传统线程技术的回顾 1 import org.junit.Test; 2 /** 3 * 传统线程回顾 4 * 多线程不一定会提高运行效率,和CPU设计和架构有关. 5 * 多线程下载是抢了服务器的资源,并不是自身的机器加快. 6 * @author LiTaiQing 7 */ 8

C#多线程编程实例 线程与窗体交互

代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = new Thread[10]; public Form1() { InitializeComponent(); } //此委托允许异步的调用为Listbox添加Item delegate void AddItemCallback(string text); //这种方法演示如何在线程安全的模式下调用Windows窗体上的控件. private void

vc 基于对话框多线程编程实例——线程之间的通信

 vc基于对话框多线程编程实例--线程之间的通信 实例: vc 基于对话框多线程编程实例--线程之间的通信,码迷,mamicode.com

.NET面试题解析(07)-多线程编程与线程同步

系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等,本文只是从常见面试题的角度(也是开发过程中常用)去深入浅出线程相关的知识.如果想要系统的学习多线程,没有捷径的,也不要偷懒,还是去看专业书籍的比较好. 常见面试题目: 1. 描述线程与进程的区别? 2. 为什么GUI不支持跨线程访问控件?一般如何解决这个问题? 3. 简述后台线程和前台线程的区别? 4. 说说常

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

Linux程序设计学习笔记----多线程编程之线程同步之条件变量

转载请注明出处:http://blog.csdn.net/suool/article/details/38582521. 基本概念与原理 互斥锁能够解决资源的互斥访问,但是在某些情况下,互斥并不能解决问题,比如两个线程需 要互斥的处理各自的操作,但是一个线程的操作仅仅存在一种条件成立的情况下执行,一旦错过不可再重现,由于线程间相互争夺cpu资源,因此在条件成立的时候,该线程不一定争夺到cpu而错过,导致永远得不到执行..... 因此需要某个机制来解决此问题,更重要的是,线程仅仅只有一种情况需要执