如何为线程分配变量值以及何时应该完成?

时间:2012-07-18 11:48:44

标签: java multithreading

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

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

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

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

我不知道是否需要我做作业this.hostname=hostname?我什么时候需要写单词this.?我是否需要使用单词this.将主机名发送到Myfunction?

2 个答案:

答案 0 :(得分:1)

你必须在构造函数中使用this.hostname,因为你有一个名为hostname的参数,所以如果你不使用this,你只需要存储参数的值论证本身。

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

另请参阅When should I use "this" in a class?Java - when to use 'this' keyword

答案 1 :(得分: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是您的类的公共方法,并且可以像访问任何其他方法一样访问所有类private,public和protected属性。

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