我正在开发一个内存和计算密集型项目.执行的很大一部分利用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) 为例:
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中工作.这里的困惑是,如果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线程的应用程序的问题.应用程序运行许多工作线程,这些线程在输入队列中连续查看,如果队列中有消息,则将它们拉出并处理它们.
在这些工作线程中,有另一个验证线程被安排在固定的时间段执行检查以查看主机(应用程序运行的主机)是否仍处于"良好状态"以运行应用程序.该线程更新一个AtomicBoolean值,该值在工作线程开始窥视之前由工作线程验证,以查看主机是否正常.
我的问题是,在高CPU负载的情况下,负责验证的线程将花费更长的时间,因为它必须与所有其他线程竞争.如果在AtomicBoolean一段时间后没有得到更新,它会自动设置为false,这会给我带来一个令人讨厌的瓶颈.
我最初的方法是增加验证线程的优先级,但深入挖掘它我发现这不是一个保证行为,算法不应该依赖线程优先级来正常运行.
有人有任何其他想法吗?谢谢!
我编写了一个.NET winforms应用程序,它使用辅助线程进行一些繁重的处理,将其进程传回UI线程.一切正常,表单显示进度,我还创建了一个取消按钮来中断处理线程.但是,当耗时的过程进入应用程序时,我的整个计算机都会慢下来.拖动窗口需要很长时间,并且在尝试在记事本中键入字母时甚至会有明显的延迟.
我假设我需要降低处理线程的优先级,和/或增加UI线程的优先级.这是正确的吗?现在两个线程都是普通优先级.
这跟下面一样容易吗?或者我还应该做些什么呢?
Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
Run Code Online (Sandbox Code Playgroud)
我该如何改变优先顺序?我应该降低处理的优先级,还是提高UI的优先级,或两者兼而有之?到了什么环境?高于正常还是最高?
我在面试中被问到以下问题:"垃圾收集线程的默认优先级是什么?" 我知道我们不能强制GC或改变它的优先级,虽然我从来没有听说过它的默认优先级.有人知道吗?
在某些情况下,当几个后端进程碰巧同时运行时(队列管理是别的,我可以这样解决,但这不是问题),我得到了 General error: 1205 Lock wait timeout exceeded; try restarting transaction ROLLING BACK
具有较低优先级的进程是锁定表的进程,因为它在高优先级之前几分钟开始.
如何优先查询已经运行的进程?
希望它足够清楚.
我已经看到了很多这个问题的答案,但我仍然不确定.
其中之一是"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) 如果我在Eclipse中调试一些多线程Java代码 - 使用主类RunTest和一个有趣的类QueueListener.
假设:
在Eclipse中调试时 - 两个断点都会出现.但Eclipse优先考虑RunTest - 我必须通过在调试器中选择该线程来手动将其翻转到QueueListener - 并反复重复这一过程.
有没有办法告诉Eclipse我对QueueListener更感兴趣,并认为testrunner是一个较低的优先级 - 当它选择显示调试断点时?
我有一些数据采集应用程序在带有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,但即使它们的优先级较低.
我不知道从哪里去...... :-(
thread-priority ×10
java ×7
.net ×1
c# ×1
eclipse ×1
io ×1
linux-kernel ×1
locking ×1
mysql ×1
preemptive ×1
real-time ×1
threadpool ×1