有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程可能会影响Java对象。等会被打断吗?

在Java文档中,它说中断函数可以中断object.wait。但在我的测试中,在windows中是的,它可以被中断,但在Linux中是错误的,它不能被中断

原因似乎是Glibc 2.1.3中的pthread_cond_wait无法再被系统信号中断

我的理解正确吗

public static void main(String[] args)
{

    Thread t = new Thread()
    {
        public void run()
        {
            Object obj = new Object();
            synchronized(obj) {
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    System.out.println("interrupted");
                    e.printStackTrace();
                }
            }
        }
    };

    t.start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    t.interrupt();
            System.out.println("interrupt is called");
            try {
        Thread.sleep(100000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

共 (3) 个答案

  1. # 1 楼答案

    您应该始终正确地尊重中断,并将其理解为尽快优雅地终止的请求。系统是否真的可以执行中断是无关紧要的,因为您的代码可以在许多不同的机器和操作系统上运行

    在您的代码中,请在末尾添加一个t.join(),并检查它在Linux上是否仍然不可中断。因为可能是程序在线程被授予实际处理中断的时间之前终止得太快了

  2. # 2 楼答案

    例如,以下java代码:

    mdInputStream = new BufferedInputStream( new FileInputStream( new File( MD_CONFIG_FILE )));
    SessionSettings mdSettings = new SessionSettings(mdInputStream);
    mdInputStream.close();
    
    LogFactory mdScreenLogFactory = new ScreenLogFactory(true, true, true, true);
    LogFactory mdFilelogFactory = new FileLogFactory(mdSettings);
    
    MessageFactory messageFactory = new DefaultMessageFactory();
    
    mdInitiator = new SocketInitiator(mdApplication, mdMessageStoreFactory, mdSettings, mdFilelogFactory, mdScreenLogFactory, messageFactory);
    mdInitiator.start();
    
  3. # 3 楼答案

    JavaAPI说一个等待的线程可以被另一个线程中断。JavaAPI总是正确的。所有JVM实现都必须遵守它所说的内容