当前位置: 首页 > 知识库问答 >
问题:

如何使用线程观察者

程鸿波
2023-03-14

我正在进行一个项目,我们在该项目中遇到了线程问题。有一个问题使线程终止,并且线程无法自动重新启动,因此我们想更改当前的实现。我们想出了一个想法来运行一个观察者线程来管理文件处理线程。
请有人建议如何制作监视程序状态的线程以及如何执行此操作的想法。

编辑:所以基本上这就是发生的事情。用户上载一些写入文件共享的媒体文件。移动服务中运行的线程扫描媒体文件并附加到电子邮件。在此过程中,线程终止,无法将媒体连接到电子邮件。

下面是我的servlet和run方法中的代码。

private synchronized void startProcessing() {
    boolean processor = false;
    try {
        Properties mProp = SystemUtil.filterProperties(SystemImpl.getInstance().getApplicationProperties("Media"));
        processor = (Boolean.parseBoolean(mProp.getProperty("processor", "false")) && Boolean.parseBoolean(System.getProperty("RunProcessor", "false")));
    } catch (Exception e) {
        logger.log(Level.INFO, "Unable to get 'processor' value from property file.  Defaulting to false.");
    }
    if (processor) {
        if (null != thread) {
            if (thread.getState().equals(State.TERMINATED)) {
                thread = new Thread(fProc);
            }
        } else {
            thread = new Thread(fProc);
        }
        if (thread.getState().equals(State.NEW)) {
            logger.log(Level.INFO, "processor starting...");
            thread = new Thread(fProc);
            thread.start();
            logger.log(Level.INFO, "processor successfully started.");
        } else {
            logger.log(Level.INFO, "processor thread is already running.");
        }
    } else {
        logger.log(Level.INFO, "processor configured not to run.");
    }
}

public void run() {
    int sleepTime = 10000;
    try {
        sleepTime = Integer.parseInt(mProp.getProperty("ProcessorSleepTime"));
        waitTime = -(Integer.parseInt(mProp.getProperty("ProcessorWaitTime")));
        keepProcessed = Boolean.parseBoolean(mProp.getProperty("KeepProcessed"));
    } catch (Exception ex) {
        logger.log(Level.WARNING, "Unable to read property file.  Using default values.");
    }
    File filePath = new File(MResource.getMRepositoryPath());
    File processingPath = new File(filePath.getPath() + "/" + PROCESS_FOLDER_NAME);
    if (!processingPath.exists()) {
        processingPath.mkdirs();
    }
    File failurePath = new File(filePath.getPath() + "/" + FAILURE_FOLDER_NAME);
    if (!failurePath.exists()) {
        failurePath.mkdirs();
    }
    File processedPath = new File(filePath.getPath() + "/" + PROCESSED_FOLDER_NAME);
    if (!processedPath.exists()) {
        processedPath.mkdirs();
    }
    while (!stopProcessing) {
        isProcessing = true;
        logger.log(Level.FINEST, "Checking for files...");
        try {
            processFiles(filePath, processingPath, failurePath, processedPath);
            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
                logger.log(Level.INFO, "Thread sleep interrupted.");
            }
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Error while processing files.", e);
        }
    }
    isProcessing = false;
    stopProcessing = false;
    logger.log(Level.WARNING, " file processor has stopped.");
}

共有2个答案

马琛
2023-03-14

您绝对不应该终止线程。也许你应该让线程等待。要重新启动线程,您需要知道它终止时的确切状态。您必须保存该线程的状态,然后完美地重建正确的线程。所以你的第一个问题可能是“我该怎么做”。如果不全面了解你的程序,就不可能告诉你。但这应该是绝对的最后手段。因为几乎在所有情况下,这都是一个极其可怕的想法。(预计会有更多错误超出您的处理能力)

TLDR;

这是个坏主意。不要终止线程。

编辑:我想你必须先找到杀死线程的bug。如果没有找到,那么无论如何都无法在线程死亡之前保存线程的状态。您可以尝试使用打印语句或调试

璩和璧
2023-03-14

我认为修复原因比重新启动更容易。终止线程的方法只有两种:

  1. 正在调用线程。停止()。这是不推荐的,99.9%不是您的情况

如果你真的需要一个观察者,你可以这样做:

void run() {
    while (true) {
        thread.join();
        thread = new Thread(myRunnable);
        thread.start();
    }
}
 类似资料:
  • 是否有无论如何告诉java rx在观察函数中使用当前线程?我正在为android sync适配器编写代码,我希望在同步适配器线程中而不是在主线程中观察结果。 使用Retrofit RXJava的示例网络调用如下所示: 我试着使用 这与android rx为主线程创建调度程序的方式相同,但一旦我替换了Looper,它就不再工作了。myLooper()用于活套。getMainLooper()。 我可以

  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 我写了通过超文本传输协议请求JSON的服务: 从服务中为组件分配一个值: 我想测试一下。有一个单元测试: 我收到以下错误消息: 预期[对象({完成:假,id: 1,title:'title1',userId: 1})]等于可观察({_isScalar:假,_subscribe:函数})。 我尝试使用以下模拟: 但在这种情况下,我得到了以下弹出在我的IDE: 类型为“{completed:boole

  • 问题内容: 一个人如何监视/触发一条路线上的事件? 问题答案: 以下事件也可用(它们的回调函数采用不同的参数): $ routeChangeSuccess $ routeChangeError $ routeUpdate-如果将reloadOnSearch属性设置为false

  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首