gpt4 book ai didi

java - 有可能发现操作系统在线程上进行上下文切换吗?

转载 作者:行者123 更新时间:2023-11-29 08:10:26 25 4
gpt4 key购买 nike

我想知道如何在 java 中捕获被上下文切换中断的线程。我有两个线程并排运行,它们都在向上和向下更改同一个 int,为了我的报告,我想知道如何捕捉开关,并做一些事情。 (例如,在发生这种情况时制作一个简单的 System.out)谢谢!

最佳答案

就应用而言context switches不可见 - 没有信号或消息发送到通知它的应用程序。

唯一可能提示应用程序的是时间。例如,如果您反复为一个紧凑的循环计时,您可能能够(不可靠地)检测到循环执行时发生的上下文切换,因为与执行循环相比所需的时间更长没有被打断。不幸的是,这只适用于像 C 这样的编译语言。像 Java 这样使用虚拟机的语言使得几乎不可能可靠地检测到这样的事情,因为循环变慢可能归因于多种原因,例如垃圾收集器在起作用。

此外,请记住,任何系统调用——尤其是 I/O 调用,如您用来记录此类事件的调用——通常会导致隐式上下文切换,这可能会导致您可能想做的任何事情都中断.

为什么你会想知道这样的事情呢?尤其是来自 Java 应用程序?

编辑:

好吧,如果您在创建同步问题之后,这是我的版本:

public class Test {
public static long count = 0;

public static void main(String[] args) {
for (int run = 0; run < 5; ++run) {
Test.count = 0;

Thread[] threads = new Thread[10];

for (int i = 0; i < threads.length; ++i) {
threads[i] = new Thread(new Runnable() {
public void run() {
for (long i = 0; i < (10 * 1000 * 1000 * 1000); ++i) {
Test.count += 1;
}
}
});
}

for (int i = 0; i < threads.length; ++i) {
threads[i].start();
}

for (int i = 0; i < threads.length; ++i) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

System.out.println(Test.count);
}
}
}

这是我从一次运行中得到的结果:

1443685504
1439908180
1461384255
1477413204
1440892041

关于java - 有可能发现操作系统在线程上进行上下文切换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8420438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com