我是处理多线程的新手。我在一点上感到困惑,并寻求澄清。我在主程序中有以下内容:
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?
答案 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方法。