gpt4 book ai didi

java - 将数据传递给正在运行的线程的正确方法是什么

转载 作者:行者123 更新时间:2023-11-30 06:35:44 27 4
gpt4 key购买 nike

在大多数情况下,当您创建线程时,您可以预先准备好数据并将其传递给构造函数或方法。

然而,在像打开套接字连接这样的情况下,您通常已经创建了一个线程,但希望告诉它执行一些操作。

基本思路:

C#

private Thread _MyThread = new Thread(MyMethod);
this._MyThread.Start(param);

Java

private Thread _MyThread = new Thread(new MyRunnableClass(param));
this._MyThread.start();

Now what?

那么在 C# 和 Java 中将数据传递给正在运行的线程的正确方法是什么?

最佳答案

将数据传递给正在运行的线程的一种方法是实现 Message Queues .想要告诉监听线程做某事的线程会向监听线程的队列中添加一个项目。监听线程以阻塞方式从该线程读取。在没有要执行的操作时使其等待。每当另一个线程将消息放入队列时,它就会获取消息,具体取决于项目及其内容,然后您可以对其执行一些操作。

这是一些 Java/伪代码:

class Listener
{
private Queue queue;
public SendMessage(Message m)
{
// This will be executed in the calling thread.
// The locking will be done either in this function or in the Add below
// depending on your Queue implementation.
synchronize(this.queue)
{
this.queue.put(m);
}
}

public Loop()
{
// This function should be called from the Listener thread.
while(true)
{
Message m = this.queue.take();
doAction(m);
}
}

public doAction(Message m)
{
if (m is StopMessage)
{
...
}
}
}

调用者:

class Caller
{
private Listener listener;

LetItStop()
{
listener.SendMessage(new StopMessage());
}
}

当然,在编写并行/并发代码时有很多最佳实践。例如,代替 while(true),您至少应该添加一个字段,例如 run::Bool,您可以在收到 StopMessage 时将其设置为 false。根据您想要实现它的语言,您将需要处理其他原语和行为。

例如,在 Java 中,您可能希望使用 java.util.Concurrent包,让事情变得简单。

关于java - 将数据传递给正在运行的线程的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5636811/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com