对于我的论文,我正在研究离散事件系统模拟器。模拟包括一组SimulatorThread extends Thread
,其作用在于将Event
调度到Simulator
。每个SimulatorThread
通过Simulator
与SimulatorInterface
互斥。
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 Runnable
的ExecutorService
模式更好。关于java - ThreadFactory和newThread(Runnable r)如果r是线程,如何访问r的属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16170947/