我想知道如何在java中捕获被Context Switch中断的线程。 我有两个并排运行的线程,它们都在上下改变相同的int,我想为了我的报告,知道如何捕获交换机,并做一些事情。 (例如,当发生这种情况时,制作一个简单的System.out)谢谢!
答案 0 :(得分:3)
就应用程序而言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
答案 1 :(得分:2)
记录进行修改的主题。
每次修改int时,都要存储进行修改的线程。如果它与前一个线程不同,请创建System.out。
否则,您需要一个允许您中断上下文切换的操作系统。我不知道允许你这样做的操作系统。
答案 2 :(得分:0)
我认为您不能从线程调度程序(部分OS核心)监听事件,但您可以使用拉策略: