如何在java中执行线程

时间:2015-07-10 16:14:20

标签: java multithreading

我有一个代码 -

public class ThreadOne
{
    public static void main(String[] args)
    {
        Thread1 th=new Thread1();
        Thread1 th2=new Thread1();
        th.start();
        th2.start();
        System.exit(1);
    }
}


class Thread1 extends Thread
{
    public void run()
    {
        for(int i=0;i<10;i++)
        {
            System.out.println(i);
        }
    }
}

我想知道的是 -

  • 为什么上面的代码没有打印任何东西?虽然我创造了2 线程并启动它们,但它没有打印任何东西。为什么?
  • 如果没有用户线程,例如说一个正常的程序组成 在main()方法中调用了很多方法和每个方法,然后是如何 默认情况下会创建许多线程,它是否依赖于数量 我们有的方法,或者是否有一个负责的主线程 用于调用所有方法,最后创建主线程的人是 它是创建它的JVM吗?

8 个答案:

答案 0 :(得分:5)

System.exit(1);将终止当前运行的 Java虚拟机。当你的程序退出时,你的线程也会死掉。

ThreadProcess的一部分,如果Process已退出,则所有主题都将被销毁。

Thread.join()将一直等到线程运行完毕。

public class ThreadOne
{
    public static void main(String[] args)
    {
        Thread1 th=new Thread1();
        Thread1 th2=new Thread1();
        th.start();
        th2.start();
        th.join();
        th2.join();
        System.exit(1);
    }
}


class Thread1 extends Thread
{
    public void run()
    {
        for(int i=0;i<10;i++)
        {
            System.out.println(i);
        }
    }
} 

答案 1 :(得分:1)

  1. 您的代码没有显示任何内容,因为您一旦启动就会使用System.exit()终止该应用。您应该在退出之前等待两个线程完成,例如使用Thread.join()。

  2. 默认情况下有一个线程,它执行main()方法,由JVM创建。

答案 2 :(得分:1)

由于线程不像普通的java代码那样执行同步。所以在调用th.start()之后; th2.start();它不会等待run()来完成那就是为什么System.exit(1);打电话给你,你得到了什么。

答案 3 :(得分:1)

你可以等到线程执行使用join.check以下

 public class ThreadOne
 {
public static void main(String[] args)
{
    Thread1 th=new Thread1();
    Thread1 th2=new Thread1();
    th.start();
    th2.start();
    try {
        th.join();
        th2.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.exit(1);
}

}

  class Thread1 extends Thread
{
public void run()
{
    for(int i=0;i<10;i++)
    {
        System.out.println(i);
    }
}

}

答案 4 :(得分:1)

根据有关system.exit

的java文档
Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination.

以上是关于第一个问题的答案。 当JVM启动时,通常会创建一个调用main然后调用其余方法的线程。 希望它有所帮助。

答案 5 :(得分:0)

To see the numbers being printed on screen add the following:

try{
       th.join();
       th2.join();
   }catch(Exception e){
}

After th2.start() in main method.

正如其他人指出的那样,你需要给用户定义的线程一些时间来完成他们的工作,这是通过在相应的线程对象上调用join()来完成的.join()确保调用线程“等待这个线程在“继续前进之前死”。

答案 6 :(得分:0)

你的2个线程由主线程启动,因此有3个线程被调用。但是system.exit()会杀死你的主线程,导致其他2个线程在有机会运行之前终止。

答案 7 :(得分:0)

由于线程与main分开:main中的代码继续执行,System.exit(1);执行而不考虑线程并关闭程序。