gpt4 book ai didi

Java如何在作业完成时调用或通知调用类?

转载 作者:行者123 更新时间:2023-12-03 19:11:33 25 4
gpt4 key购买 nike

我对线程进行了简单的调用,它完成了简单的工作。当满足条件时
我想调用或通知基类(启动线程的那个)
工作完成了。
做这个的最好方式是什么 ?

class TaskThread implements Runnable 
{

private int result = -1;
public TaskThread()
{

}
//must be thread safe
public synchronized int getResult()
{
return result;
}

@Override
public void run() {

if(result==-1 || result < 0)
{
StartFoo();
result = InvokeAPI();
if(result == 1)
{
// HERE i like to do something to notify the outside world that the job is done ...
}

}
}
}


//Base class
public class ScheduledThreadsManager {

private static ScheduledThreadsManager instance = null;
private ScheduledExecutorService scheduler;
private Runnable pTaskThread = null ;
protected ScheduledThreadsManager()
{

}

//must be set only once in the app life cycle
public void Init(int corePoolSize,
long TimeUnitINSeconds)
{
pTaskThread = new TaskThread();
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(pTaskThread,1,TimeUnitINSeconds,TimeUnit.SECONDS);
}
public int getResult()
{
return pTaskThread.;
}
// Runtime initialization
// By defualt ThreadSafe
public static ScheduledThreadsManager getInstance() {
if(instance == null){
synchronized (ScheduledThreadsManager.class) {
if(instance == null){
instance = new ScheduledThreadsManager();
}
}
}
return instance;
}


public void ShutdownNow()
{

pTaskThread = null ;
scheduler.shutdown();
}
}

现在我是这样调用它的:

//somewhere in the code 

ScheduledThreadsManager.getInstance().init(1,10);
int runThis = true;
while(runThis)
{
int ifOne = ScheduledThreadsManager.getInstance().getResult()
if(ifOne==1)
{
runThis = false;
ScheduledThreadsManager.getInstance().ShutdownNow()
}
}

我不确定这是最好的方法,我能否以某种方式从 TaskThread run 方法中获取方法并更新 ScheduledThreadsManager?

最佳答案

不通知调用对象:使用 ExecutorService Future .

您可以提交 RunnableExecutorService并取回 Future :

Future<?> future = executorService.submit(myRunnable);

现在您可以调用future.get() (可选择超时),它将阻塞直到 Future 完成:

future.get();
future.get(5, TimeUnit.MINUTES);

这意味着您不需要引入任何新的回调接口(interface)或类似接口(interface)。您也不需要调用 future.get()立即:你可以提交一大堆任务,然后调用get稍后。

请注意,如果您提交 Callable<T>ExecutorService ,你会得到一个 Future<T> :如果您希望长时间运行的计算返回一个值,这很有用。

Guava 扩展了 Future ListenableFuture 的接口(interface),它允许您在 Future 后执行回调已经完成。 Java 8 还添加了 CompleteableFuture ,但我还处于黑暗时代,所以我从未使用过它:)

关于Java如何在作业完成时调用或通知调用类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33629305/

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