问题很混乱,但这就是我想要做的事情:
public class Main
{
MyClass instance = new MyClass();
Thread secondThread = new Thread(instance);
public static void main()
{
secondThread.start();
//here i want to call foo(), but be processed by secondThread thread(not the Main thread)
}
}
public class MyClass implements Runnable
{
@Override
public void run()
{
}
public void foo()
{
System.out.println("foo");
}
}
如果我使用“instance.foo();”它将由主线程处理。
答案 0 :(得分:4)
Runnable
的想法是它是一个合并的代码段,可以由它选择的任何上下文中的其他内容执行(在本例中为一个线程)。第二个帖子在启动时会调用run()
方法,因此您可能希望在foo()
方法中调用MyClass.run()
。您无法从主线程中任意决定第二个线程现在将放弃run()
方法中的任何操作并开始处理foo()
。
答案 1 :(得分:3)
您无法调用线程,您只能发出信号。如果你想要执行foo(),你必须发出run()信号,要求它执行foo()。
答案 2 :(得分:1)
更改您的代码如下:
public class Main
{
Object signal = new Object();
MyClass instance = new MyClass();
Thread secondThread = new Thread(instance);
public static void main()
{
instance.setSignal(signal);
secondThread.start();
synchronize(signal)
{
try{
signal.notify();**//here will notify the secondThread to invoke the foo()**
}
catch(InterrupedException e)
{
e.printStackTrace();
}
}
}
public class MyClass implements Runnable
{
Object signal;
public setSignal(Object sig)
{
signal = sig;
}
@Override
public void run()
{
synchronize(signal)
{
try{
signal.wait();
}
catch(InterrupedException e)
{
e.printStackTrace();
}
}
this.foo();
}
public void foo()
{
System.out.println("foo");
}
}
答案 3 :(得分:1)
我修改你的类以包含一个Executor,然后让它的方法让执行者运行任务。通过将执行程序传递给MyClass的构造函数,main控制任务的执行方式。
public class Main
{
Executor runner = Executors.newSingleThreadExecutor();
MyClass instance = new MyClass(runner);
public static void main()
{
instance.foo();
// cleanup executor
}
}
public class MyClass
{
private final Executor runner;
public MyClass(Executor runner)
{
this.runner = runner;
}
public void foo()
{
runner.execute(new Runnable() {
public void run() {
System.out.println("foo");
}
});
}
}