簡體   English   中英

沒有得到螺紋程序的預期輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM