0

我是处理多线程的新手。我有一点感到困惑并寻求澄清。我在主程序中有以下内容:

String hostname = null;
ExecutorService threadExecutor = Executors.newFixedThreadPool(10);
MyThread worker = null;

while(resultSet.next()) { 
  hostname = resultSet.getString("hostName");
  worker = new MyThread(hostname);
  threadExecutor.execute( worker );
}

threadExecutor.shutdown();

while (!threadExecutor.isTerminated()) {
  threadExecutor.awaitTermination(1, TimeUnit.SECONDS);
} 

实现runnable的类是:

public class MyThread implements Runnable{
  String hostname=null;

  MyThread (String hostname) {
    this.hostname=hostname;
    System.out.println("New thread created");
  }

  public void run() {
    Class1 Obj1 = new Class1();
    try {
      obj1.Myfunction(hostname);
    } catch (Exception e) {
      System.out.println("Got an Exception: "+e.getMessage());
    }
  }
}

我有一个名为主机名的变量。每个线程都需要获取这个变量,因为它必须传递给Myfunction每个线程需要执行的函数。

我在构造函数中定义了一个名为 hostname 的变量。然后我将变量发送hostname到,MyFunction(hostname).因为hostname在类中定义MyThread,然后它作为参数发送到Myfunction的主机名是线程的主机名。

不知道有没有必要做任务this.hostname=hostname??我什么时候需要写这个词this.?我需要将主机名与单词一起发送到 Myfunctionthis.吗?

4

2 回答 2

1

您必须this.hostname在构造函数中使用,因为您有一个名为的参数hostname,因此如果您不使用this,您只需将参数的值存储在参数本身中。

run你不必使用this,因为在函数的范围内没有其他同名的变量。

另请参阅我什么时候应该在课堂上使用“this”?Java - 何时使用“this”关键字

于 2012-07-18T11:57:32.223 回答
1

看起来您的问题不是多线程,而是面向对象编程的基本概念。让我们暂时忘记 runnable 和 executors。

您正在定义一个具有主机名字段的类,然后定义一个采用此参数的构造函数,并将内部值设置为该参数。关键字 this 仅在构造函数的参数与类字段具有相同名称的情况下才是必需的。这与它是可运行的事实无关!您可以在类中的任何其他方法中使用它,如下所示。

public class HostNameResolver {

    private String hostname = null;

    public HostNameResolver (String externalValue) {

        this.hostname = externalValue;

    }

    public void addToDb() {
        DbAdder dbAdder = new DbAdder();
        dbAdder.add(hostName);
   }
}

如果你想让这些东西在 Executor 抽象上异步调度,这是对线程的抽象,你需要这个类来实现 Runnable 接口,其中包含一个方法 run。方法 run 是您的类的公共方法,并且可以像任何其他方法一样访问所有类的私有、公共和受保护属性。

原因很简单:当你向 ExecutorService 提交 Runnable 时,ExecutorService 会在有 Runnable 可用时立即将 Runnable 传递给 Thread,并调用你的 run 方法。

于 2012-07-18T12:00:14.387 回答