gpt4 book ai didi

java - 没有获得线程程序的预期输出

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:19 25 4
gpt4 key购买 nike

程序如下:

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

为什么每次启动新线程时都会实例化新日期,但两个时间值相同。是因为多核处理器吗?

程序取自here

最佳答案

当您创建一个 Runnable 并将对它的引用传递给两个线程对象时,这意味着这两个线程正在执行同一个 Runnable,它们正在更改同一个对象。

run 方法在设置实例变量和打印出来之间 hibernate 了 4 秒。第二个线程在一秒钟后启动。第二个线程有足够的时间用不同的字符串覆盖实例变量。当线程打印时,它们在同一个 Runnable 上打印相同的值。

您链接到的文章的作者提出的观点是,即使两个线程使用相同的 Runnable 实例,当更改的值位于 ThreadLocal 中时,每个线程都会分别保存自己的值。发布的代码使用共享 Runnable 的普通实例成员显示了相反的情况,以便通过对比显示 ThreadLocal 为何有用。

如果您不希望线程共享状态,请为每个线程提供自己的 Runnable,或使用 ThreadLocal。 Threadlocal 在横切情况下很有用,可将对象限制在线程中,在这种情况下,您希望线程执行的不同方法可以访问同一对象,而无需显式传递它。 (有一个常见的场景使用 threadlocal 来存储非线程安全类 SimpleDateFormat 的实例。)

不要反射性地进行同步,很多时候最直接的答案是避免共享。

关于java - 没有获得线程程序的预期输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44060030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com