在Java中为线程添加其他方法?

时间:2014-12-22 10:27:05

标签: java multithreading algorithm concurrency

我想我可以通过尝试这样的方式来做到这一点,但它不起作用:

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方法。

3 个答案:

答案 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;