如何将参数传递给Java线程?

时间:2012-10-15 13:22:10

标签: java multithreading

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

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()?

7 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

jobId作为Abstract Class的成员变量,并在start方法中设置此变量。
现在可以在run()方法中访问此变量。

答案 3 :(得分: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();

答案 4 :(得分: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);
        }       
    }

答案 5 :(得分:0)

我认为你做的事情是正确的。

只需更改

  test.start(74);

main

 test.start(new Integer(74));

您可以在jobId课程的start方法中打印Job来验证它。

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

答案 6 :(得分: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 ...
}