我已经看到了:How can I pass a parameter to a Java Thread?
但我不知 Prop 体如何使用它。所以我做了简单的示例代码来节省您宝贵的时间:
class ThreadParam implements Runnable {
static int c;
public ThreadParam(int a, int b){
int c = a+b;
}
public void run(){
System.out.println(c);
}
}
public class ThreadParamTest {
public static void main(String args[]){
Runnable r = new ThreadParam(1000,2000);
new Thread(r).start();
}
}
为什么这个结果是 0 ?我认为应该是 3000。也许变量“int c”没有分派(dispatch)给 run() 方法。我该如何解决这个问题?
最佳答案
我认为“static int c”的选择是不正确的,因为它意味着 ThreadParam 的所有实例都将“共享”(并且很糟糕)c 的公共(public)值。也就是说,如果您有 2 个单独的 ThreadParams 同时运行,其中一个可能会为 C 提供“错误”值。考虑...
class BadThreadParam implements Runnable {
static int c;
public BadThreadParam( int a, int b ) {
c = a + b;
}
public void run() {
System.out.println( c );
}
}
class ImmutableThreadParam implements Runnable {
private final int c;
public ImmutableThreadParam( int a, int b ) {
c = a + b;
}
public void run() {
System.out.println( c );
}
}
public class BadThreadParamTest {
public static void main( String[] args ) {
BadThreadParam shouldBe3 = new BadThreadParam( 1, 2 );
BadThreadParam shouldBe5 = new BadThreadParam( 3, 2 );
shouldBe3.run(); // Expect 3 but is 5. WTF?
shouldBe5.run(); // Expect 5.
ImmutableThreadParam expect3 = new ImmutableThreadParam( 1, 2 );
ImmutableThreadParam expect5 = new ImmutableThreadParam( 3, 2 );
expect3.run(); // Expect 3.
expect5.run(); // Expect 5.
}
}
如果将“c”设为实例本地,则可以克服“2 个独立的 ThreadParams 影响相同的值”的问题。如果你将“private int c”设为final,你就避免了同步的需要。如果您需要在运行中(或从外部)对“c”进行向下变异,那么您现在就进入了同步的世界……
class ThreadSafeMutableThreadParam implements Runnable {
private int c;
public ThreadSafeMutableThreadParam( int a, int b ) {
c = a + b;
}
public synchronized void setC( int c ) {
this.c = c;
}
public synchronized int getC() {
return c;
}
public void run() {
System.out.println( getC() );
}
}
除此之外,tuxdna 在描述您如何“将参数传递给 Runnable”方面是正确的。 Runnable 是无关紧要的;您正在将参数传递给一个类(无论您如何实现)。如果您需要它们在 run() 中可用,则需要注意同步。
关于java - 将参数传递给 Java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20640896/