给定一台核心计算机上同时运行的2个线程。 在Java中,是否可以在某种意义上优先于一个线程优先于某个线程,以便每次运行一个切片时,一个线程有75%的机会获得切片,而切片两个仅获得25%的机会?
我尝试通过设置线程的优先级来尝试,但是线程一首先要完成,然后线程二才开始。
答案 0 :(得分:0)
您可以将Thread对象的优先级从1(最低)到10(最高)进行排序。具有较高优先级的线程更有可能在较低优先级的线程之前被分配处理器时间,但是没有任何被授予者。
您可以定义一个ThreadFactory
,该线程以一定的优先级启动线程,并将其与执行程序一起使用。这只是从队列中优先
@RequiredArgsConstructor
class PriorityThreadFactory implements ThreadFactory {
private final Queue<Integer> priorities;
@Override
public Thread newThread(Runnable r) {
final var thread = new Thread(r);
final var priority = this.priorities.remove();
thread.setName(String.format("Priority: %d", priority));
thread.setPriority(priority);
return thread;
}
}
如果您运行该命令,则启动几个线程:
class HeavyComputation implements Runnable {
@Override
public void run() { new Random().ints().max().getAsInt(); }
}
final var factory = new PriorityThreadFactory(10, 1);
factory.newThread(new HeavyComputation()).start();
factory.newThread(new HeavyComputation()).start();
Thread.currentThread().join();
随着时间的流逝,您会注意到具有更高优先级的线程会消耗更多的CPU时间:
$ jstack -l `pgrep -f Test` |grep Priority "Priority: 10" #13 prio=10 os_prio=0 cpu=571668.65ms elapsed=573.02s tid=0x00007f3990652000 nid=0x2f8a80 runnable [0x00007f397793d000] "Priority: 1" #14 prio=1 os_prio=0 cpu=560930.84ms elapsed=573.02s tid=0x00007f39906bb000 nid=0x2f8a81 runnable [0x00007f397783c000]