作业

作业

1
package threadlocal;<br><br>import java.util.concurrent.ExecutorService;<br>import java.util.concurrent.Executors;<br><br>public class ThreadLocalHomework {<br>    //创建线程池<br>    public static ExecutorService threadPool= Executors.newFixedThreadPool(20);<br><br>    //创建线程要执行的方法<br>    public String data(int num){<br>        //清除之前线程访问的数据<br>        ThreadSafeStringBuilder.stringBuilderThreadLocal.remove();<br>        //获取每个线程要获取的对象<br>        StringBuilder stringBuilder=ThreadSafeStringBuilder.stringBuilderThreadLocal.get();<br>        //清除之前的数据<br>        stringBuilder.delete(0,stringBuilder.length());<br>        //添加数据<br>        return  stringBuilder.append("数字"+num).toString();<br>    }<br>    //测试<br>    public static void main(String[] args) {<br>        //20个请求<br>         for(int i=0;i<20;i++){<br>             int count=i;<br>           threadPool.execute(new Runnable() {<br>               @Override<br>               public void run() {<br>                   try {<br>                       Thread.sleep(1000);<br>                   } catch (InterruptedException e) {<br>                       e.printStackTrace();<br>                   }<br>                   //执行添加数据方法<br>                 String result= new ThreadLocalHomework().data(count);<br>                   System.out.println(result);<br>               }<br>           });<br>         }<br>         //关闭线程<br>        threadPool.shutdown();<br>        System.out.println("是否关闭:"+threadPool.isShutdown());<br>    }<br><br>}<br><br><br>//生成创建threadlocal类<br>class ThreadSafeStringBuilder{<br>    public static ThreadLocal<StringBuilder> stringBuilderThreadLocal<br>            =new ThreadLocal<StringBuilder>(){<br>        @Override<br>        protected StringBuilder initialValue() {<br>            return new StringBuilder();<br>        }<br>    };<br>}<br>


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕小脸 2021-06-19 19:00:06

同学你好,

1、上述贴出的代码实现了最终效果,棒棒的~继续加油

2、线程池中的线程是会重复利用的,也就是说有可能会出现多个任务使用同一个 ThreadLocal

祝学习愉快~

  • 提问者 rock221 #1

    也就是说有可能会出现多个任务使用同一个 ThreadLocal 什么意思啊?是线程复用了初始化的对象,出现了安全问题吗?

    2021-06-20 17:45:00
  • 好帮手慕小班 回复 提问者 rock221 #2

    同学你好,同学可以这样理解:在使用中,数据是在线程池创建时绑定在线程上的,而线程池中的线程是会重复利用的,所以会可能会出现多个任务可能会访问使用同一个 ThreadLocal,造成线程安全问题。

    祝学习愉快~

    2021-06-20 19:09:49
  • 提问者 rock221 回复 好帮手慕小班 #3

    是同一个线程 重复使用了初始化的对象吧 ?  

    2021-06-20 19:17:48
rock221 提问者 2021-06-19 18:23:22

追加,对于threadLocal 有点晕,  使用这个会出现多线程不安全的情况,因为并发会导致多个线程调用同一个threadLocal对象,因为这个对象是statc唯一的,共享的。然后这个对象里面去new我们需要工具对象,  每次线程调用threadLocal的get方法时,获取工具对象, 那下次同一个线程再次调用get方法,执行不同的任务时,会重新创建工具对象吗?还是从threadLocal取出之前使用过的, ? 

2、 如果每次都创建的话, 那就和new 直接创建工具类是一样的,那使用threadLocal去创建有什么好处呢???

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码