如何将同一类的两个不同实例传递给两个不同的线程

时间:2014-06-10 15:54:29

标签: java multithreading hashcode runnable

我有一个关于线程的问题,我已经搜索了解决方案,但无法澄清。 考虑我有一个Runnable类

public class MyThread implements Runnable {
String x = "";
public MyThread (String s) { 
    x = s;
  }

  public void run() { 
     // x = "hello";
      System.out.println("runobject: "+this.hashCode());
      System.out.println("runstring: "+x.hashCode());
    System.out.println("x: "+ x); 
      } 
}

我有另一个主要方法为

的类
import java.util.Scanner;

public class TestThread {
    public static void main (String arg[]) { 

        Thread t1 = new Thread(new MyThread("John"));
        Thread t2 = new Thread(new MyThread("Mike"));
        t1.start();
        t2.start();
    }
}

上面的代码将输出显示为

runobject: 33810571
runstring: 2314539
x: John
runobject: 33810633
runstring: 2398230
x: Mike

现在在theMyThread类中,如果我在构造函数中删除x的赋值,并在下面的run方法中引入赋值x = "hello";

public class MyThread implements Runnable {
    String x = "";
    public MyThread (String s) { 
        //x = s;
      }

      public void run() { 
          x = "hello";
          System.out.println("runobject: "+this.hashCode());
          System.out.println("runstring: "+x.hashCode());
        System.out.println("x: "+ x); 
      } 
}

我得到的输出是

runobject: 33810572
runstring: 99162322
x: hello
runobject: 33810634
runstring: 99162322
x: hello

注意:在第二种情况下,x变量的哈希码在两个线程中都是相同的。请解释上面的场景。为什么在第二种情况下,两个线程都引用相同的x变量并生成相同的哈希码?

提前致谢。

1 个答案:

答案 0 :(得分:2)

字符串常量存储在缓存中。分配它时,无论在何处或何时分配它,都会从缓存中为其分配相同的String常量。

改为new String("hello"),你会得到一个不同的字符串。

此外,hashCodeequals可以解除String的值。所以无论你拥有Strings多少String,如果你有equals"你好"它始终会对hashCodeequals做出同样的回复。这实际上是hashCode和{{1}}的用途 - 快速找到具有相同价值的内容。