如何从另一个线程访问一个线程的方法?

时间:2014-12-22 15:11:03

标签: java multithreading concurrency

我目前正在开发的应用程序应该创建一堆线程,每个线程包含一些数据集合并自己创建一堆线程。这些线程(第三层)应该接收一些数据并将其发送到其父线程中的集合,然后该线程将进一步发送该数据。

我的问题是我无法找到一种方法来访问集合本身或从另一个线程修改它的方法。有什么建议吗?

4 个答案:

答案 0 :(得分:2)

您的问题陈述非常模糊,因此我只能指出一些可能会或可能不会帮助您的资源:

答案 1 :(得分:1)

如果您只是希望在父线程子线程之间共享一个集合,您可以声明一个变量并将其传递给子线程。那么,你如何将它传递给子线程?好吧,您可以创建一个Runnable或其他一些可保存对象的可执行文件,如下例所示(Runnable可以在另一个帖子中执行)。

public class MyRunnable implements Runnable {
    private final Queue<String> sharedQueue;

    public MyRunnable(Queue<String> sharedQueue) {
        this.sharedQueue = sharedQueue;
    }

    public void run() {
        // do stuff with sharedQueue here
    }
}

并开始一个主题:

final Queue<String> q = new ConcurrentLinkedQueue<>();
new Thread(new MyRunnable(q)).start();

另一种选择是使用匿名内部类(或lambdas),如下例所示,它只是启动一堆期货并将数据共享给Queue(这可能是共享数据的一个很好的候选者) :

// Shared data
final Queue<String> q = new ConcurrentLinkedQueue<>();

// Declare some threads (you can skip this part and instead use the ForkJoinPool)
// which is the default thread pool for CompletableFuture
ExecutorService executorService = Executors.newFixedThreadPool(3);

// Create tasks, complete all of them
CompletableFuture<Void> future = CompletableFuture.allOf(
    CompletableFuture.runAsync(() -> q.offer(Thread.currentThread().getName()), executorService),
    CompletableFuture.runAsync(() -> q.offer(Thread.currentThread().getName()), executorService),
    CompletableFuture.runAsync(() -> q.offer(Thread.currentThread().getName()), executorService),
    CompletableFuture.runAsync(() -> q.offer(Thread.currentThread().getName()), executorService),
    CompletableFuture.runAsync(() -> q.offer(Thread.currentThread().getName()), executorService)
);

// Wait for the threads to complete
future.get();

// Print the result
q.forEach(System.out::println);

答案 2 :(得分:0)

如果我理解正确,在构造第3层线程时将第2层线程作为参数。然后,第3层线程可以直接从第二层线程访问集合,或者可能更好,调用第二层线程的receiveData(...)方法。

答案 3 :(得分:0)

您可能需要查看ExecutorServiceCallable。它没有做你要求的事情,因为它没有把结果放在集合中,但它可能只是你需要

以下是一个例子。

package whatever;

import java.util.*;
import java.util.concurrent.*;
import java.lang.*;
import java.io.*;

class Example
{
    public static void main (String[] args) throws java.lang.Exception
    {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        Future<String> result = executor.submit(new Callable<String>() {
            public String call() throws Exception {
                Thread.sleep(20);
                return "some data";
            }
        }
        );
        String value = result.get();
        System.out.println("The thread returned:" + value);
    }
}

调用executor.submit启动一个主题并返回Future。当线程返回时,它将值放在Future中,并且父线程可以通过调用get来检索它。您可以使用其他方法来验证线程是否已完成。

从您的问题中可以清楚地知道这是否足够,但由于实施起来相当简单,如果符合您的要求,您可能需要考虑使用它。