将参数传递给Java Thread

Jun*_*tae 1 java multithreading

我已经看到了:如何将参数传递给Java Thread?

但我不知道究竟是怎么用的.所以我制作了简单的代码来节省宝贵的时间:

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();  
}   
}
Run Code Online (Sandbox Code Playgroud)

为什么这个结果为0?我认为应该是3000.也许变量"int c"不是调度run()方法.我该如何解决这个问题?

Bob*_*har 6

我认为"static int c"的选择是不正确的,因为这意味着ThreadParam的所有实例都将"共享"(并且很差)c的公共值.那就是留下来,如果你有两个单独的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.
    }
}
Run Code Online (Sandbox Code Playgroud)

如果将"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() );
    }
}
Run Code Online (Sandbox Code Playgroud)

除此之外,tuxdna在描述你如何"将params传递给Runnable"方面是正确的.Runnable无关紧要; 你把params传给了一个班级(但是你实现了这个目标).如果在run()中需要它们,则需要注意同步.


Xav*_*tte 5

c不应该是静态的,应该在你的构造函数中分配。在您的示例中,您已分配给变量c,而不是字段。

这是更正后的代码:

class ThreadParam implements Runnable { 
private int c;

public ThreadParam(int a, int b){
    this.c = a+b;
}

public void run(){
    System.out.println(c);
}

}
Run Code Online (Sandbox Code Playgroud)