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)
将在线程dosomething上myThread或main线程中执行?
如何dosomething从主线程开始执行myThread并检索返回的对象?
main(){
MyThread my = new MyThread().run();
Object o = my.dosomething(p);
}
Run Code Online (Sandbox Code Playgroud)
void run()类型的对象MyThread.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)
这应该让你知道你在做什么"错误".一个更现实的例子是,如果你生成多个线程,同时运行它们然后加入所有线程,直到它们全部完成.