用Java中的另一个线程触发线程的方法

Ski*_*kip 2 java multithreading

假设我有一个class MyThread,Runnable用一个方法实现dosomething():

class MyThread implements Runnable{
    Object dosomething(Parameter p){ ... }    
    run(){...};
}
Run Code Online (Sandbox Code Playgroud)

如果我做:

main(){
    MyThread my = new MyThread().run();    
    Object o = my.dosomething(p);
}
Run Code Online (Sandbox Code Playgroud)

将在线程dosomethingmyThreadmain线程中执行?
如何dosomething从主线程开始执行myThread并检索返回的对象?

Kir*_*ril 8

main(){
    MyThread my = new MyThread().run();    
    Object o = my.dosomething(p);
}
Run Code Online (Sandbox Code Playgroud)
  • 如果你这样做它将无法编译:你试图将void方法的结果分配给void run()类型的对象MyThread.
  • 实现runnable和调用run()不会导致代码在单独的线程中执行,除非您将其传递给另一个线程(即Tread t = new Thread(my);)

如何从主线程开始在myThread上执行dosomething并检索返回的对象?

您可以将结果存储在doSomething()稍后可以访问的位置.

class MyClass
{
    public Object doSomething()
    {
        // return the object
        return new Object();
    }
}

class MyRunnable implements Runnable
{
    private final MyClass _mc;
    private final object _lock;
    private final List<object> _results;

    public MyRunnable(MyClass mc, List<object> results, object lock)
    {
        _mc = mc;
        _lock = lock;
        _results = results;
    }

    public void run()
    {
        synchronized(_lock)
        {
            _results.add(_mc.doSomething());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在主要:

void main(){

    MyClass mc = new MyClass();
    List<object> results = new List<object>();
    object lock = new object();

    // Execute your thread and wait for it to complete
    Thread t = new Thread(new MyRunnable(mc, results, lock ));
    t.start();
    t.join();

    // Get the results
    for(object result:results)
    {
        // do something with the result
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该让你知道你在做什么"错误".一个更现实的例子是,如果你生成多个线程,同时运行它们然后加入所有线程,直到它们全部完成.