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()方法.我该如何解决这个问题?
我认为"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()中需要它们,则需要注意同步.
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)
| 归档时间: |
|
| 查看次数: |
21370 次 |
| 最近记录: |