个人笔记 Java多线程(六)

这段笔记是参照b站教程BV1Rv411y7MU整理而来的,用于个人备忘以便复习,需要的朋友可以自取。

线程间通讯(下)

1. ThreadLoad的使用

public class Test {

    //定义ThreadLocal对象
    private static ThreadLocal threadLocal = new ThreadLocal();

    //定义线程类
    private static class MyThread extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                //设置线程相关值
                threadLocal.set(Thread.currentThread().getName()+" - "+i);
                //调用get方法读取相关值
                System.out.println(Thread.currentThread().getName()+" value = "+threadLocal.get());
            }
        }
    }

    public static void main(String[]args){
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        t1.start();
        t2.start();
    }
}
  • 使用ThreadLocal进行多线程下日期格式转换
/**
 * 多线程环境中,把字符串转换成日期对象,多个线程使用通过一个SimpleDateFormat对象可能会产生线程安全问题,有异常
 * 为每个线程指定自己的SimpleDateFormat对象,使用ThreadLocal
 */
public class Test01{

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
    static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<>();

    public static void main(String[]args){
        for (int i = 0; i < 100; i++) {
            new Thread(new ParseDate(i)).start();
        }
    }

    //定义Runnable接口
    static class ParseDate implements Runnable{

        private int i =0;

        public ParseDate(int i){
            this.i=i;
        }

        @Override
        public void run() {
            String text = "2021年11月22日 08:28:"+i%60;
            //先判断当前线程是否有SimpleDateFormat对象,没有就创建
            try {
                if(threadLocal.get()==null){
                threadLocal.set(new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"));
                }
                Date date = threadLocal.get().parse(text);
                System.out.println("Date: "+date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }
  • ThreadLocal设置初始值
public class Test02 {

    private static final ThreadLocal<Date> threadLocal = new SubThreadLocal();

    //定义一个ThreadLocal的子类
    static class SubThreadLocal extends ThreadLocal<Date>{
        @Override
        protected Date initialValue() {
            return new Date();//把当前日期设置为初始值
        }
    }

    public static class MyThread extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                //第一次调用ThreadLocal的get方法会返回null
                System.out.println(Thread.currentThread().getName()+" -- value = "+threadLocal.get());
                //没有日期就设置日期
                if(threadLocal.get()==null){
                    threadLocal.set(new Date());
                }
            }
        }
    }

    public static void main(String[]args){
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        t1.start();
        t2.start();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值