woj1009 最短路 The Legend of Valiant Emigration
阿新 • • 發佈:2020-08-11
public class ThreadId { static final ThreadLocal<String> t = new ThreadLocal<String>() { @Override protected String initialValue() { return new String("threadlocal"); } };
}
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Demo { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService pool = Executors.newFixedThreadPool(5); for(int i = 0; i<15;i++) { Runnable runnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println(ThreadId.t.get()+":"+Thread.currentThread().getName()); ThreadId.t.set("ss"); System.out.println(System.currentTimeMillis()+": doSomeThing"); ThreadId.t.remove();//####1 } }; pool.execute(runnable); } pool.shutdown(); } }
//####1 所在行註釋掉和不註釋的區別。ThreadLocal 是與執行execute()方法對應的Thread繫結的,如果使用執行緒池,線上程池中的執行緒的生命週期與所提交執行的任務的生命週期並不相同,
那麼在任務中當第一次ThreadId.t.set()方法呼叫後,與該執行緒繫結,由於ThreadLocal是static修飾的,當改變後,相對應的執行緒key 的ThreadLocal value
值將會是修改後的資料,後面每次獲得的值都將會是最新。如果只是想該任務結束後,不影響其他任務對ThreadLocal值的初始化改變,應當remove().