java - 将参数传递给 Java 线程

标签 java multithreading

我已经看到了: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/

相关文章:

java - 在java中实例化接口(interface)(Android)

java - 如何在 Java 中实现 A*?

java - JBoss 中的 JNDI 绑定(bind)(LiveCycle 交 key )

尽管使用同步块(synchronized block),Java HashMap ConcurrentModification 异常

c++ - 锁定线程安全队列的 move 构造函数的右值参数?

java - 上下文切换时间

c# - 为什么 MemoryCache 抛出 NullReferenceException

java - GraalVM 中的异常链

java - 如何清空Actor死信队列

java - 使用 Executor 和 WebSocket 的多线程