标签: thread-priority

在Win7中运行多线程Java项目的零星问题

我正在开发一个内存和计算密集型项目.执行的很大一部分利用a的多线程FixedThreadPool.简而言之; 我有一个线程用于从几个远程位置(使用URL连接)获取数据并填充BlockingQueue要分析的对象和n个挑选这些对象并运行分析的线程.编辑:见下面的代码

现在,这种设置就像运行的OpenSUSE 11.3我的Linux机器上的魅力,但一个同事正在测试其运行Win7的是得到一个非常类似的机器上的自定义通知队列轮询超时(见下面的代码),他们很多实际.我一直在尝试监控她的机器上的处理器使用情况,看起来该软件在我的机器上没有超过15%的CPU,处理器的使用量达到了我的预期.

那么,我的问题是,这可能是队列"饥饿"的标志吗?可能是因为生产者线程没有获得足够的CPU时间?如果是这样,我如何才能更优先考虑池中的一个特定线程?

更新: 我一直试图找出问题,没有任何快乐......但我确实获得了一些新的见解.

  • 使用JVisualVM分析代码的执行表明了一种非常奇特的行为.这些方法在短时间的CPU时间内被调用,两次之间没有任何进展.这对我来说意味着操作系统在某种程度上对这个过程起了制动作用.

  • 禁用防病毒和备份守护进程对此问题没有任何重大影响

  • 通过任务管理器(这里建议)更改java.exe(唯一实例)的优先级也不会改变任何内容.(话虽这么说,我不能给java"实时"优先级,并且必须满足于"高"prio)

  • 分析网络使用情况显示出良好的数据流入和流出,因此我猜这不是瓶颈(虽然它是流程执行时间的相当一部分,但我已经知道并且几乎与我在Linux机器上得到的东西).

关于Win7操作系统如何限制我的项目的CPU时间的任何想法?如果它不是操作系统,可能是什么限制因素?我想再次强调,机器不会同时运行任何其他计算密集,除了我的软件之外,cpu几乎没有任何负载.这真让我抓狂...

编辑:相关代码

public ConcurrencyService(Dataset d, QueryService qserv, Set<MyObject> s){

    timeout = 3;
    this.qs = qserv;
    this.bq = qs.getQueue();
    this.ds = d;
    this.analyzedObjects = s;
    this.drc = DebugRoutineContainer.getInstance();
    this.started = false;

    int nbrOfProcs = Runtime.getRuntime().availableProcessors();
    poolSize = nbrOfProcs;
    pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(poolSize);
    drc.setScoreLogStream(new PrintStream(qs.getScoreLogFile()));
}

public void serve() throws InterruptedException {
    try {
        this.ds.initDataset();
        this.started = true; …
Run Code Online (Sandbox Code Playgroud)

java multithreading threadpool thread-priority

12
推荐指数
1
解决办法
1055
查看次数

如何在java中确保代码块不会被任何其他线程中断

为例:

new Thread(new Runnable() {
  public void run() {
    while(condition) {

      *code that must not be interrupted*

      *some more code*
    }
  }
}).start();

SomeOtherThread.start();

YetAntherThread.start();
Run Code Online (Sandbox Code Playgroud)

如何确保不会中断的代码不会被中断?

java multithreading synchronization thread-priority

11
推荐指数
2
解决办法
1万
查看次数

Java多线程 - 线程优先级

任何人都可以解释线程优先级如何在java中工作.这里的困惑是,如果java不保证Thread根据其优先级的实现,那么为什么这个setpriority()函数用于.

我的代码如下:

public class ThreadSynchronization implements Runnable{

    public synchronized void run() {
        System.out.println("Starting Implementation of Thread "+Thread.currentThread().getName());
        for(int i=0;i<10;i++)
        {
            System.out.println("Thread "+Thread.currentThread().getName()+" value : "+i);
        }
        System.out.println("Ending Implementation of Thread "+Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        System.out.println("Program starts...");
        ThreadSynchronization th1 = new ThreadSynchronization();
        Thread t1 = new Thread(th1);
        t1.setPriority(1);
        synchronized(t1)
        {
            t1.start();
        }

        ThreadSynchronization th2 = new ThreadSynchronization();
        Thread t2 = new Thread(th2);
        t2.setPriority(9);
        synchronized (t2) {
            t2.start(); 
        }

        System.out.println("Program ends...");
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的程序中,即使我改变优先级,我发现输出没有区别.另外,如何使用线程优先级的实时应用将会有很大帮助.谢谢.

java multithreading thread-priority

11
推荐指数
2
解决办法
7632
查看次数

CPU负载中的Java多线程

我有一个运行多个Java线程的应用程序的问题.应用程序运行许多工作线程,这些线程在输入队列中连续查看,如果队列中有消息,则将它们拉出并处理它们.

在这些工作线程中,有另一个验证线程被安排在固定的时间段执行检查以查看主机(应用程序运行的主机)是否仍处于"良好状态"以运行应用程序.该线程更新一个AtomicBoolean值,该值在工作线程开始窥视之前由工作线程验证,以查看主机是否正常.

我的问题是,在高CPU负载的情况下,负责验证的线程将花费更长的时间,因为它必须与所有其他线程竞争.如果在AtomicBoolean一段时间后没有得到更新,它会自动设置为false,这会给我带来一个令人讨厌的瓶颈.

我最初的方法是增加验证线程的优先级,但深入挖掘它我发现这不是一个保证行为,算法不应该依赖线程优先级来正常运行.

有人有任何其他想法吗?谢谢!

java multithreading thread-priority

9
推荐指数
1
解决办法
387
查看次数

更改线程优先级以使我的程序和计算机更具响应性

我编写了一个.NET winforms应用程序,它使用辅助线程进行一些繁重的处理,将其进程传回UI线程.一切正常,表单显示进度,我还创建了一个取消按钮来中断处理线程.但是,当耗时的过程进入应用程序时,我的整个计算机都会慢下来.拖动窗口需要很长时间,并且在尝试在记事本中键入字母时甚至会有明显的延迟.

我假设我需要降低处理线程的优先级,和/或增加UI线程的优先级.这是正确的吗?现在两个线程都是普通优先级.

这跟下面一样容易吗?或者我还应该做些什么呢?

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
Run Code Online (Sandbox Code Playgroud)

我该如何改变优先顺序?我应该降低处理的优先级,还是提高UI的优先级,或两者兼而有之?到了什么环境?高于正常还是最高?

.net c# multithreading thread-priority

8
推荐指数
2
解决办法
3万
查看次数

Java垃圾收集线程优先级

我在面试中被问到以下问题:"垃圾收集线程的默认优先级是什么?" 我知道我们不能强制GC或改变它的优先级,虽然我从来没有听说过它的默认优先级.有人知道吗?

java multithreading garbage-collection thread-priority

8
推荐指数
2
解决办法
7556
查看次数

如何优先处理某些查询?

在某些情况下,当几个后端进程碰巧同时运行时(队列管理是别的,我可以这样解决,但这不是问题),我得到了 General error: 1205 Lock wait timeout exceeded; try restarting transaction ROLLING BACK

具有较低优先级的进程是锁定表的进程,因为它在高优先级之前几分钟开始.

如何优先查询已经运行的进程?

希望它足够清楚.

mysql locking thread-priority

8
推荐指数
1
解决办法
7901
查看次数

Java先发制人吗?

我已经看到了很多这个问题的答案,但我仍然不确定.

其中之一是"Java是先发制人".(JVM使用抢占式,基于优先级的调度算法(通常是循环算法)进行调度.

第二个是如果两个具有相同优先级的线程运行Java将不会抢占,一个线程可能会饿死.

所以现在我编写了一个程序来检查它,我创建了10个具有最小优先级的线程,然后是10个具有最高优先级的线程,结果是我在所有线程之间跳转 - 这意味着即使两个线程具有相同的优先级,Java也是先发制人的优先

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @
 */
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        for (int i=0;i<10;i++){
            Thread t=new Thread(new Dog(i));
            t.setPriority(Thread.MIN_PRIORITY);
            t.start();
        }

        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
            Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
        }
        for (int i …
Run Code Online (Sandbox Code Playgroud)

java multithreading preemptive thread-priority

7
推荐指数
1
解决办法
5784
查看次数

如何在Eclipse断点中优化Java testrunner?

如果我在Eclipse中调试一些多线程Java代码 - 使用主类RunTest和一个有趣的类QueueListener.

假设:

  • 初始化RunTest时 - QueueListener在后台运行.
  • 当RunTest完成时 - QueueListener被终止
  • RunTest中有一个方法 - 其中有一个断点
  • QueueListener中有一个方法,其中包含断点
  • QueueListener可以反复运行
  • RunTest每次执行只运行一次(父类)

在Eclipse中调试时 - 两个断点都会出现.但Eclipse优先考虑RunTest - 我必须通过在调试器中选择该线程来手动将其翻转到QueueListener - 并反复重复这一过程.

有没有办法告诉Eclipse我对QueueListener更感兴趣,并认为testrunner是一个较低的优先级 - 当它选择显示调试断点时?

java eclipse multithreading thread-priority

7
推荐指数
1
解决办法
1431
查看次数

为什么Linux"系统"线程阻止我的RT线程工作?

我有一些数据采集应用程序在带有TI Linux的DM8148上的Linux 2.6.37下运行.我有两个主题:

  • 名为IDE的线程,调度为SCHED_RR,prio 114(75),每2ms从HW FIFO收集到达200MiB/s的数据到30MiB环形缓冲区:

    while(1) {
      sleep(ms);
      while(DataInFIFO) {
          CollectToRingBuffer();
          SignalToWriter(); }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 线程WriterIDE,调度为SCHED_RR,prio 113(74),将此环形缓冲区写入USB盘上.

    while(1) {
      WaitForSignal();
      writeToFileOnDOK();
    }
    
    Run Code Online (Sandbox Code Playgroud)

我从write()功能测量中知道,有时这个USB写入可能会"挂起"大约1.5秒甚至2秒,试图写入DOK.但我确信,当我给收集器任务30MiB,足够150s时,一切都会好的.

没有!它不是!
我把时间测量代码.而我所看到的是,当作者挂了很长时间(fe1342ms),然后进入收集器线程时间也非常大(306ms).这会导致HW FIFO溢出和数据不一致.

我检查了系统中线程优先级的传播(ps命令) - 没有什么是实时的,除了我.所有系统任务都被安排为OTHER(ps输出中的TS),甚至是内核USB线程.只有IRQ任务是FF,但即使它们的优先级较低.

我不知道从哪里去...... :-(

io multithreading real-time linux-kernel thread-priority

7
推荐指数
0
解决办法
163
查看次数