0

如何在此代码中在 Runnable 上设置 id

Runnable rd = new Runnable() {
    @Override
    public void run() {
        populatePanel(referList.get(handler.getPosition()), handler.getPosition());
        if (i == referList.size() - 1) {
            i = 0;
        }
    }
};
handler.postDelayed(rd, delay);

我想区分一个线程和另一个线程

4

4 回答 4

5

您在线程上设置名称,而不是在 Runnable 上,例如使用以下内容:

    RunnableJob runnableJob = new RunnableJob();

    Thread thread1 = new Thread(runnableJob);
    thread1.setName("thread1");
    thread1.start();

    Thread thread2 = new Thread(runnableJob, "thread2");
    thread2.start();

    Thread thread3 = new Thread(runnableJob);
    thread3.start();

    Thread currentThread = Thread.currentThread();
    System.out.println("Main thread: " + currentThread.getName() + "(" +currentThread.getId() + ")");

这将打印以下内容:

RunnableJob is being run by thread1 (11)
RunnableJob is being run by thread2 (12)
Main thread: main(1)
RunnableJob is being run by Thread-1 (13)

来源在这里

于 2013-07-08T09:30:53.827 回答
0

您正在创建一个匿名子类。就子类化而言,这里没有什么特别之处,例如,您可以轻松地将private final int ID = 42字段添加到您的类中,然后在您的 run 方法或方法中使用该字段toString。但是,如果您需要添加公共 API,则不能使用匿名类,但可以使用内部类来实现另一个接口。

于 2013-07-08T09:31:04.837 回答
0

使用实例 ID 创建内部类。

handler.postDelayed(new MyRunnable(1), delay);  
handler.postDelayed(new MyRunnable(2), delay);




class MyRunnable implements Runnable{    
  long id;  
  public MyRunnable(long id){  
this.id = id;  
}
  @Override  
    public void run() {  
        populatePanel(referList.get(handler.getPosition()), handler.getPosition());  
        if (i == referList.size() - 1) {  
            i = 0;  
        }  
    }

}
于 2013-07-08T09:35:10.260 回答
0

区分线程的标准方法是为每个线程命名。请参阅 java.util.concurrent 包中的 ExecutorService 的 ThreadFactory。

或者,如果你真的有一个业务案例想要通过runnable来区分,你需要实现自己的类并引用一些成员变量。

对我来说,带有 ExecutorService 的 ThreadFactory 是正确的。

于 2013-07-08T09:29:47.180 回答