我想我可以通过尝试这样的方式来做到这一点,但它不起作用:
Thread[] threads = new Thread[myNumThreads];
for (int i=0; i<myNumThreads; i++) {
threads[i] = new Thread () {
@Override
public void run() {
<Code to do when running>
}
//CODE I TRIED TO ADD:
public boolean getValue(){
return true;
}
};
}
基本上不是调用join()来结束一个线程,而是想让一个线程做一些事情并在仍然运行时将一些数据返回给main方法。
答案 0 :(得分:3)
运行代码时,它始终使用当前线程。如果代码附加到另一个线程对象,例如的Thread.join();它仍然是后台线程运行时等待的当前线程。
让另一个线程完成工作的最简单方法是使用ExecutorService
ExecutorService es = Executors.newFixedThreadPool(myNumThreads);
List<Future<ResultType>> futures = new ArrayList<>();
for (int i = 0; i < myNumThreads; i++) {
futures.add(es.submit(new Callable<Result>() {
public ResultType call() {
// do something
return result;
}
});
}
// do something while the thread task executes
for (Future<ResultType> future: futures) {
ResultType result = future.get();
}
// when finished with the pool
es.shutdown();
答案 1 :(得分:2)
很难弄明白你的意思&#34;它不起作用&#34;但我想你可能只是错过了对
的号召threads[i].start();
如果您希望能够从类外部调用getValue()方法,那么您将需要创建一个新的MyThread类来扩展Thread并使用该类型而不是线程:
class MyThread extends Thread {
@Override
public void run() {
for (int j=0 ; j< 10; j++) {
System.out.println("working:" + j + ":" + this.getValue());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//CODE I TRIED TO ADD:
public boolean getValue(){
return true;
}
}
然后按如下方式调用它:
int myNumThreads = 10;
MyThread[] threads = new MyThread[myNumThreads];
for (int i=0; i<myNumThreads; i++) {
threads[i] = new MyThread () ;
threads[i].start();
}
System.out.println(threads[0].getValue());
答案 2 :(得分:1)
你可以尝试编写自己的线程:喜欢&#34; MyThread扩展线程&#34;