繁体   English   中英

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

[英]How can I access the method of one thread from another thread?

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

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

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

如果仅希望在父线程子线程之间共享一个集合,则可以声明一个变量并将其传递给子线程。 那么,如何将其传递给子线程? 好吧,您可以创建一个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();

另一种选择是使用匿名内部类(或lambda),如下面的示例所示,该类仅启动一堆期货并将数据共享到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);

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

您可能需要查看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来检索它。 您可以使用其他方法来验证线程是否已完成。

从您的问题尚不清楚这是否满足要求,但是由于它实现起来很简单,因此,如果满足您的要求,您可能要考虑使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM