可以捕获操作系统在线程上进行上下文切换吗?

时间:2011-12-07 18:22:00

标签: java multithreading scheduler context-switching

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

3 个答案:

答案 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核心)监听事件,但您可以使用拉策略:

  1. 制作一些静态易变字符串字段
    • 在每个帖子中读取此字段(经常)
    • 如果字段值!=“current-thread-name”=&gt; print“Context is Switched to”+ thread-name
    • 将线程名称写入字段