0

我在抽象类中有一个代码:

public abstract class Job implements Runnable{  
    public void start(Integer jobId) {                      
        try {
            new Thread(this).start();
        } catch (Exception e) {
            e.getMessage();
        }       
    }
}

班级代码:

public class Test extends Job {

    @Override
    public void run() {
        for(int i = 0; i < 5; i++) {
            try {
                Thread.currentThread();
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("TEST");
        }       
    }
}

主要我有:

public static void main (String[] args) throws MessagingException  
  {
      Test test = new Test();
      test.start(74); 
  }

那么如何将参数(jobId)从 start 方法传递给 run()?

4

7 回答 7

2

Job.start()方法中,将值存储在成员变量中,以便run()稍后在线程启动时在方法中访问它。

public abstract class Job implements Runnable {
    protected Integer jobId;

    public void start(Integer jobId) {
        this.jobId = jobId;
        try {
            new Thread(this).start();
        } catch (Exception e) {
            e.getMessage();
        }       
    }
}

public class Test extends Job {
    @Override
    public void run() {
        System.out.println(jobId);
    }
}
于 2012-10-15T13:25:26.443 回答
1

您应该将其更改为构造函数参数,并将其存储在派生类的字段中。

于 2012-10-15T13:23:36.240 回答
1

jobId作为抽象类的成员变量,并在方法start中设置该变量。
现在这个变量将可以在run()方法中访问。

于 2012-10-15T13:25:08.347 回答
0

将构造函数的参数传递给线程:

public class MyThread implements Runnable {

   public MyThread(int parameter) {
   // store parameter for later user
   }

   public void run() {
   }
}

并像这样调用:

Runnable r = new Thread(new MyThread(param_value)).start();
于 2012-10-15T13:26:44.330 回答
0

最简单的方法。但我确信这不是最好的。正如我之前所说,这是最简单的方法。:)

public abstract class Job implements Runnable{  
    public void start(Integer jobId) {                      
        try {
            // passing jobID
            Test.jobID = this.jobId;
            new Thread(this).start();
        } catch (Exception e) {
            e.getMessage();
        }       
    }
}

和其他类..

public class Test extends Job {

   public static Integer jobID;

    @Override
    public void run() {
        for(int i = 0; i < 5; i++) {
            try {
                Thread.currentThread();
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // print jobID
            System.out.println(this.jobID);
        }       
    }
于 2012-10-15T13:30:00.157 回答
0

我认为你做对了。

只是改变

  test.start(74);

在你main

 test.start(new Integer(74));

jobId您可以通过在类的start方法中打印来验证它Job

如果要访问方法中的字段,请run在“作业运行”方法中定义一个类变量class and use the same in

于 2012-10-15T13:35:03.143 回答
0

我是否可以建议您重新考虑生成作业 ID 的方式。您很可能只需要每个新工作的唯一 ID。生成该 id 的问题应该存在于您的 Job 类中:

public abstract class Job implements Runnable {
  private static final AtomicInteger nextId = new AtomicInteger();
  public final int id = nextId.getAndIncrement();

  ... the rest of your class's code ...
}
于 2012-10-15T13:35:37.380 回答