私があなたの問題を理解している場合、ビデオ再生がJavaで行われるのと同様に、スレッドを適応的にスリープさせることが1つの方法です。コア使用率を50%にすることがわかっている場合、アルゴリズムは約0.5秒スリープ状態になります.1秒以内に潜在的に分散されます(0.25秒計算、0.25秒スリープ、など)。私のビデオプレーヤーのexampleです
long starttime = 0; // variable declared
//...
// for the first time, remember the timestamp
if (frameCount == 0) {
starttime = System.currentTimeMillis();
}
// the next timestamp we want to wake up
starttime += (1000.0/fps);
// Wait until the desired next time arrives using nanosecond
// accuracy timer (wait(time) isn't accurate enough on most platforms)
LockSupport.parkNanos((long)(Math.max(0,
starttime - System.currentTimeMillis()) * 1000000));
このコードはフレーム/秒の値に基づいてスリープします。
メモリの使用量を抑えるには、オブジェクト作成をファクトリメソッドにラップし、一定の種類のセマフォをバイトとして使用して推定オブジェクトの合計サイズを制限します(さまざまなオブジェクトのサイズを見積もる必要があります)セマフォを配給する)。
package concur;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class MemoryLimited {
private static Semaphore semaphore = new Semaphore(1024 * 1024, true);
// acquire method to get a size length array
public static byte[] createArray(int size) throws InterruptedException {
// ask the semaphore for the amount of memory
semaphore.acquire(size);
// if we get here we got the requested memory reserved
return new byte[size];
}
public static void releaseArray(byte[] array) {
// we don't need the memory of array, release
semaphore.release(array.length);
}
// allocation size, if N > 1M then there will be mutual exclusion
static final int N = 600000;
// the test program
public static void main(String[] args) {
// create 2 threaded executor for the demonstration
ExecutorService exec = Executors.newFixedThreadPool(2);
// what we want to run for allocation testion
Runnable run = new Runnable() {
@Override
public void run() {
Random rnd = new Random();
// do it 10 times to be sure we get the desired effect
for (int i = 0; i < 10; i++) {
try {
// sleep randomly to achieve thread interleaving
TimeUnit.MILLISECONDS.sleep(rnd.nextInt(100) * 10);
// ask for N bytes of memory
byte[] array = createArray(N);
// print current memory occupation log
System.out.printf("%s %d: %s (%d)%n",
Thread.currentThread().getName(),
System.currentTimeMillis(), array,
semaphore.availablePermits());
// wait some more for the next thread interleaving
TimeUnit.MILLISECONDS.sleep(rnd.nextInt(100) * 10);
// release memory, no longer needed
releaseArray(array);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
// run first task
exec.submit(run);
// run second task
exec.submit(run);
// let the executor exit when it has finished processing the runnables
exec.shutdown();
}
}
スレッディングモデルには何を使用していますか? Javaのタスク実行プログラムですか? –
また、このアプリケーションのボトルネックはどこですか?データベース? IO? –
バッテリの寿命が問題であった場合、CPUの上限を設定したいと思う唯一の時間がありました(そして、あなたの質問は、バッテリー制限のあるデバイスで計算上高価なものをやっているときにどうすればわかりますか? 。それ以外の場合は、ユーザーが必要以上に長く待つのはなぜですか?システムの応答性を維持したい場合は、CPU使用量を制限するのではなく、スレッドの優先度を低くしてください。 –