线程如何在Java中工作以及它们的工作方式与方法中的基本代码有何不同?

nis*_*002 1 java multithreading

基本上这个代码有两个在两个类中创建的线程,它们是从第三个类中调用的.每个线程都有一个循环,并在每次迭代后休眠.

(代码到底)

输出是:

CHECK 0 CHECK
CHECK 1 CHECK
run one
in thread1 
CHECK 2 CHECK
run two
in thread2
Run Code Online (Sandbox Code Playgroud)

1)我不知道它为什么会这样运作.我的意思是可以先打印CHECK 0 CHECK.但是为什么CHECK 1 CHECK在Thread1之前打印(而在代码中调用Thread1之后),同样用于CHECK 2 CHECK和Thread2?

2)如果我用System.exit(0)替换CHECK 2 CHECK,如上例所示,在运行Thread2之前打印CHECK 2 CHECK(在Thread2旁边),为什么System.exit(0)在发生之后发生在这种情况下运行Thread2?

第二种情况的输出:

CHECK 0 CHECK
CHECK 1 CHECK
run one
in thread1 
run two
in thread2
Run Code Online (Sandbox Code Playgroud)

请告诉我为什么会这样?为什么方法中的线程和代码会以这种方式混淆?我想我对java如何管理线程一无所知.我试了很多,但找不到任何我能理解的东西.

码:

public class Thread1 implements Runnable 
{

    public Thread1()
    {
        new Thread(this).start();
    }

    public void run() 
    {
        // TODO Auto-generated method stub
        System.out.println("run one");
        try
        {
            for(int i = 0; i < 5;i++)
            {
                System.out.println("in thread1 ");
                Thread.sleep(1000);
            }
        }
        catch(Exception e)
        {
            //e.printStackTrace();
        }
    }

}

public class Thread2 implements Runnable 
{

    public Thread2()
    {
        new Thread(this).start();
    }

    public void run() 
    {
        // TODO Auto-generated method stub
        System.out.println("run two");
        try
        {
            for(int i=0;i<5;i++)
            {
                System.out.println("in thread2 ");
                Thread.sleep(1000);
            }
        }
        catch(Exception e)
        {
            //e.printStackTrace();
        }
    }
}

public class Threadjava
{
    public static void main(String[] str)
    {
        System.out.println("CHECK 0 CHECK");
        new Thread1();
        System.out.println("CHECK 1 CHECK");
        new Thread2();
        System.out.println("CHECK 2 CHECK");
        //The above is deleted in the second case
        System.exit(0);
        System.out.println("CHECK 3 CHECK");
    }
}
Run Code Online (Sandbox Code Playgroud)

alo*_*dzk 9

嗯,这是一个常见的误解,java程序本质上是单线程的,因为它们不是.当你启动一个java程序时,它正在Java虚拟机中执行,它启动了几个其他线程来执行你的代码.查看这个不错的博客:

http://blog.jamesdbloom.com/JVMInternals.html#jvm_system_threads

在你的情况下,你最重要的是,你启动一个主线程,它执行一个主方法.从那里开始两个独立的线程Thread1和Thread2,它们被安排执行,但是你不知道它们何时被OS调度程序选中以实际执行.由于许多原因,这不是确定性的:

  • 你不知道算法调度程序用什么来获取要执行的线程,
  • 你不知道你的处理器有多少核心,你的线程可以并行或串行运行
  • Just In Time编译器可能会重新排列和优化您的代码,
  • CPU可能会重新排列对IO的读写操作,以优化代码的执行,
  • 您的代码中可能存在导致数据争用,竞争条件,星标等的错误.

Java并发性是一个很难的主题,我发给你的博客条目是一个很好的起点,也可以使用它.如需认真阅读,请访问http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601.

祝好运.