即使在程序退出main()之后,是否可以执行代码

时间:2011-12-21 13:39:12

标签: multithreading process control-flow

即使程序退出main()方法,是否有可能执行代码?

9 个答案:

答案 0 :(得分:6)

在C和C ++中,可以在main()返回后调用通过atexit()注册的函数。

在C ++中,main()也可以在{{1}}返回后调用。

答案 1 :(得分:2)

也许其他一些线程可以在程序退出main()后继续工作,所以我可以说是!

public class Main extends Thread {

    public static void main(String[] args) {

        Thread thread = new Thread(new Main());
        thread.start();
        System.out.println("main is exiting");
    }

    @Override
    public void run() {
        try {
            sleep(1000);
            System.out.println("thread is running");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

答案 2 :(得分:1)

对于C#是的:只有在main()退出后才会超出范围的对象的终结符将在之后执行。

这有时会派上用场,例如删除锁定文件

答案 3 :(得分:1)

C ++:当然。只需将它放入全局对象的析构函数中,它将在main返回后运行(但请记住,不能保证仍然构造任何全局对象)。

(...虽然,诀窍是可执行文件的“真实”入口点通常不是你的main,而是初始化全局变量的另一个函数,调用你的main并在它返回时它会在终止之前销毁它们)

答案 4 :(得分:1)

您唯一的可能性是fork()和父级exit()。除此之外别无他法。线程无济于事。

答案 5 :(得分:1)

在C和C ++中,有atexit(),它会在“正常”终止期间调用一个函数。

答案 6 :(得分:0)

简单的答案是否定的。但是你总是可以在main的末尾开始一个新的线程,它甚至会在main完成之后执行。

答案 7 :(得分:0)

在C#中,您可以创建新的Thread并将IsBackground设置为false。 Main将退出,但.NET Framework将使您的应用程序继续执行它需要做的任何事情。

static void Main(string[] args)
{
    Thread thread = new Thread(() => {
        Thread.Sleep(10000);
        Console.WriteLine("Thread WriteLine");
    });

    thread.IsBackground = false;
    thread.Start();
    Console.WriteLine("Main WriteLine");
}

答案 8 :(得分:-1)

不,这是不可能的。当主方法存在时,程序终止。