繁体   English   中英

将参数传递给Java线程

[英]Passing parameters to Java Thread

我已经知道: 如何将参数传递给Java线程?

但是我不知道该怎么使用。 因此,我简化了代码示例,以节省您的宝贵时间:

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”没有调度到run()方法。 我该如何解决这个问题?

我认为“ static int c”的选择是不正确的,因为这意味着ThreadParam的所有实例都将“共享”(并且很糟糕)c的通用值。 就是这样,如果您同时有2个单独的ThreadParam,则其中之一可能表示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()中可用,则需要注意同步。

结果为0,因为在构造函数中,您实际上并未将新值分配给static int c ,而是将其分配给局部变量c

在构造函数中将int c更改为c

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);
}

}

您的'c'变量定义了两次:一次在类级别(带有静态修饰符),一次在ThreadParam构造函数中。 删除类字段上的“静态”,并删除构造函数中的“ int”。

Runnable只是一个需要您定义run()方法的接口,仅此而已。 因此,从本质上讲,您可以随意声明类构造函数(要传递两个整数ab ),以便能够从run()方法访问它们。

另外,您还要在构造函数中定义一个局部变量,该局部变量在构造函数完成后将被销毁。 这样您的static int c值仍为0

这是固定版本:

class ThreadParam implements Runnable {
    private int c;

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

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

}

public class ThreadParamTest {

    public static void main(String args[]) {
        Runnable r = new ThreadParam(1000, 20000);
        new Thread(r).start();
    }
}

输出是21000 (而不是3000

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM