【问题标题】:java - Pausing all running threads for some timejava - 暂停所有正在运行的线程一段时间
【发布时间】:2019-11-29 02:02:11
【问题描述】:

例如考虑以下场景。

App1:我有一个多线程的 java 应用程序,它在 DB 中输入了很多文件。

App2:当我使用其他应用程序访问数据库时,它获取结果的速度很慢。

因此,当两个应用程序同时工作时,数据库在前端应用程序上获取结果需要大量时间。

在这里,我想暂停 App1 上的所有事务(线程)一段时间。考虑到在使用应用程序 2 时已经安装了触发器。所以当 App2 空闲时,App1 会像什么都没发生一样恢复。请列出一些或一种最佳方法来实现这一目标

Map<Thread, StackTraceElement[]> threads = Thread.getAllStackTraces();
    for (Map.Entry<Thread, StackTraceElement[]> entry : threads.entrySet()) {
        entry.getKey().sleep();
    }

这并不好。

【问题讨论】:

  • 请阅读What types of questions should I avoid asking? - 询问主观上好的方法列表对于 SO 格式来说过于宽泛和固执己见。可能还有其他以讨论为中心的网站更适合此类问题。
  • 如果你想要一个像定时器一样工作的东西,为什么不使用定时器(java.util.Timer)?可以安排一次执行,也可以定期重复执行。
  • 或者只是在你的 Thread 中放一个 Thread.sleep,当标志设置为 true 时执行(所以如果你愿意,也可以从线程外部更改标志)跨度>
  • @billbrinck:通过 Thread.sleep() 我可以暂停当前实例线程。我想暂停所有线程。通过获取所有正在运行的线程然后触发 .sleep() 并没有真正起作用。
  • 但只有你创建的线程,对吧?

标签: java multithreading parallel-processing database-trigger thread-sleep


【解决方案1】:

只是试一试:

private List<PausableThread> threads = new ArrayList<PausableThread>();

private void pauseAllThreads()
{
    for(PausableThread thread : this.threads)
    {
        thread.pause();
    }
}

你的 Thread 类将是这样的:

public class MyThread extends Thread implements PausableThread
{

private boolean isPaused = false;

@Override
public void pause()
{
    this.isPaused = true;
}

@Override
public void run()
{
    while(!Thread.currentThread().isInterrupted())
    {
        // Do your work...

        // Check if paused
        if(this.isPaused)
        {
            try
            {
                Thread.sleep(10 * 1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
}
}

还有 PausableThread 接口:

public interface PausableThread
{
    void pause();
}

【讨论】:

  • 我从中得到了基本的想法。成功了,谢谢你的伙伴。
【解决方案2】:

针对我的场景发布解决方案答案。

我创建了一个全局标志并将其用作开关。

现在,在数据库交互之前,我只是添加了一个条件[在线程执行各种工作的各种函数中,这解决了我担心的实例问题]

if(isFlagChecked){thread.sleep(someDefinedTime);}

wait here if flag is true

continue with business logic...[db transacts here]

所以,我的问题就这样解决了,尽管它不会暂停在中间状态下运行的线程,这是一件好事——少了一个麻烦。

并行,在我的触发函数中 - 我检查了经过的时间,并在所需时间过去后将标志更改为 false。检查下面的代码骨架。

@async 
void pause() // triggered by parallel running app when required
{
   isFlagChecked=true;
   resumeTime=new Date(timeInMillis + (someDefinedTime)) // resume time to switch flag condition
   while (true) {
      if (new Date().compareTo(resumeTime) > 0) 
         isFlagChecked=false;
    }
}

经过试验和测试,一切运行良好,性能显着提高 [至少在我的场景中]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2016-03-26
    • 2013-08-19
    • 2012-12-24
    • 1970-01-01
    相关资源
    最近更新 更多