java线程常见问题

时间:2014-04-28 18:55:01

标签: java multithreading

我对java线程有一些疑问:

  1. 如果我有一个运行多个线程的类,当一个线程到达exit(1)命令行时它会退出线程还是整个应用程序,包括其他线程?
  2. 2.如何让一个线程通知从同一个类运行的所有其他线程停止?

    3.使用synchronized只使用一个线程,无论代码中的源代码是什么,都要做这部分代码?

    4.如果我使用run()在java中运行一个线程,如果我从run()内部调用一个方法,这仍然作为一个线程运行还是不允许?

2 个答案:

答案 0 :(得分:2)

1)只有当线程是守护进程时,即使它们正在运行,应用程序也不会等待关闭。

示例:评论与否setDaemon(true)

public class Test {
    public static void main(final String[] args) {
        new Launcher(parent).start();
    }

    public static class Launcher extends Thread {
        public Launcher(final String name) {
            this.setName(name);
        }

        @Override
        public void run() {
            System.err.println(getName() +  is starting);
            for (int i = 0; i < 10; i++) {
                new Waiter(child  + i).start();
            }
            try {
                Thread.sleep(1000);
                System.err.println(getName() +  is no more sleeping);
            } catch (final InterruptedException e) {
                e.printStackTrace();
            }
            System.err.println(getName() +  is stopping);
        }
    }

    public static class Waiter extends Thread {
        public Waiter(final String name) {
            super(name);
            super.setDaemon(true);
        }

        @Override
        public void run() {
            System.err.println(getName() +  is starting);
            try {
                Thread.sleep(12000);
                System.err.println(getName() +  is no more sleeping);
            } catch (final InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

2)强制停止,可以使用不同的方法,不同的模式。很抱歉没有解决方案。您可以查看:http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadGroup.html

3)是的,这是同步的目标。

4)这取决于你做什么,但基本上,调用方法不会启动另一个线程,除非方法这样做。

答案 1 :(得分:1)

  

如果我有一个运行多个线程的类,当一个线程到达exit(1)命令行时它会退出线程还是整个应用程序,包括其他线程?

System.exit(1)的调用将终止调用线程所有其他线程。这是结束Java程序最残酷的方式,即完全关闭JVM,并且很少根本不可用。

  

如何让一个线程通知从同一个类运行的所有其他线程停止?

完全没有。如果您有其他Thread个对象的引用,则可以调用Thread#interrupt(),但是其他线程是否检查其中断状态或到达可能会抛出InterruptedException的位置他们。

  

使用synchronized只使用一个线程,无论代码中的源代码如何,都可以执行这部分代码吗?

直观地说是。但是,当此块中存在wait()时,相应的锁(即synchronized上的对象)将被释放并可由其他线程获取。

  

如果我使用run()在java中运行一个线程,如果我从run()内部调用一个方法,它仍然作为一个线程运行,或者它是不允许的?

当一个线程调用一个方法时,那个同样的线程也执行这个方法(默默地想知道它应该怎么做......)