对于我的论文,我正在研究离散事件系统模拟器。模拟包括一组SimulatorThread extends Thread,其作用在于将Event调度到Simulator。每个SimulatorThread通过SimulatorSimulatorInterface互斥。

public abstract class SimulatorThread extends Thread {
    private SimulatorInterface si;

    public SimulatorThread(SimulatorInterface si) {
        this.si = si;
    }
    ...
}

public final class Simulator {
    private ExecutorService exec;
    ...

    public void assignThread(SimulatorThread... stList) {
        ...
    }
}

在模拟开始之前,将每个SimulatorThread分配给Simulator,然后Simulator将通过exec.execute(simulatorThread)执行每个线程。我的问题是,在代码的某些部分中,我需要获得对当前正在运行的SimulatorThread的引用,但是指令(SimulatorThread) Thread.currentThread()给出了强制转换执行。实际上System.out.print(Thread.currentThread().getClass())的输出是class java.lang.Thread,但是我希望输出是class SimulatorThread,可以通过使用指令simulatorThread.start()而不是执行程序运行线程来获得ThreadFactory。所以我认为问题出在写一个临时的SimulatorThread,该实例返回SimulatorThreadFactory extends ThreadFactory的一个实例。

实际上,我尝试使用琐碎的newThread:
public class SimulatorThreadFactory implements ThreadFactory {

    @Override
    public Thread newThread(Runnable r) {
        return new SimulatorThread(new SimulatorInterface());
    }
}

并由此获得了先前引用的输出“类SimulatorThread”。问题是,当我调用“exec.execute(simulatorThread)”时,该参数具有我需要访问的属性“SimulatorInterface”,但是我无法因为方法“newThread”的参数是“Runnable” '。我在这里暴露了一个错误的代码,我希望它能比用语言解释的方式更好地表达我的意思:
public class SimulatorThreadFactory implements ThreadFactory {

    @Override
    public Thread newThread(Runnable r) {
        SimulatorInterface si = r.getSimulatorInterface(); // this is what
                                                           // I would like
                                                           // the thread factory
                                                           // to do
        return new SimulatorThread(si);
    }
}

因此,如何在方法SimulatorThread中访问'SimulatorThread'的'SimulatorThreadface'属性,以便在其参数为Runnable的情况下创建ojit_code呢?

最佳答案

如果我了解您的需求,那么执行此操作的正确方法是不扩展Thread,而是实现Runnable。然后可以享受您自己的类层次结构的所有好处:

public abstract class SimulatorRunnable extends Runnable {
     protected SimulatorInterface si;
     public SimulatorRunnable(SimulatorInterface si) {
         this.si = si;
     }
}

public final class Simulator extends SimulatorRunnable {
     public Simulator(SimulatorInterface si) {
         super(si);
     }
     public void run() {
         // here you can use the si
         si.simulate(...);
     }
}

然后,将模拟器提交到线程池:
 Simulator simulator = new Simulator(si);
 ...
 exec.submit(simulator);



您不应该将Thread传递给ExecutorService。它只是将其用作Runnable(因为Thread实现Runnable),线程池启动了自己的线程,并且永远不会在start()上调用SimulatorThread。如果要扩展Thread,则需要直接调用thread.start()而不将其提交给ExecutorService。上面的带有implements RunnableExecutorService模式更好。

关于java - ThreadFactory和newThread(Runnable r)如果r是线程,如何访问r的属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16170947/

10-10 19:27