[英]Not getting expected output for threaded program
以下是該計划:
import java.util.Date;
public class ThreadLocalReplaceWithString {
public static class MyRunnable implements Runnable {
private String threadLocal = new String("");
@Override
public void run() {
threadLocal= new Date().toString();
try {
Thread.sleep(4000);
} catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName()+
" start time = "+threadLocal);
}
}
public static void main(String[] args) throws InterruptedException {
MyRunnable myRunnable = new MyRunnable();
Thread thread1 = new Thread(myRunnable,"Thread-1");
Thread thread2 = new Thread(myRunnable,"Thread-2");
thread1.start();
Thread.sleep(1000); //Start thread-2 after 1 second.
thread2.start();
}
}
輸出:
Thread-1 start time = Fri May 19 06:45:47 IST 2017
Thread-2 start time = Fri May 19 06:45:47 IST 2017
為什么兩個時間值相同,即使每次啟動新線程時都會實例化新日期。 是因為多核處理器?
程序取自這里
當您創建一個Runnable並將其引用傳遞給兩個線程對象時,這意味着兩個線程正在執行相同的Runnable,它們正在更改同一個對象。
run方法在設置實例變量並將其打印出來之間休眠4秒。 第二個線程在一秒鍾后啟動。 第二個線程有足夠的時間用不同的字符串覆蓋實例變量。 當線程打印時,它們在同一個Runnable上打印相同的值。
您鏈接到的文章的作者所指出的是,即使兩個線程使用相同的Runnable實例,當更改的值在ThreadLocal中時,每個線程也會單獨保存自己的值。 發布的代碼顯示了使用共享Runnable的普通實例成員的相反情況,以便相反地顯示ThreadLocal有用的原因。
如果您不希望線程共享狀態,請為每個線程分配自己的Runnable,或者使用ThreadLocal。 Threadlocal在交叉情況下非常有用,可以將對象限制在線程中,您希望線程執行不同的方法來訪問同一個對象而不顯式傳遞它。 (有一種常見的場景使用threadlocal來存儲非線程安全類SimpleDateFormat的實例。)
不要反復進行同步,很多時候最直接的答案是避免共享。
這是預期的產出。 您從中獲取代碼的頁面說:
ThreadLocal替換為String。 Thread-1的threadLocal值被Thread-2的threadLocal值覆蓋。 因此,threadLocal為兩個線程打印了相同的開始時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.