小编典典

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

java

基本上,此代码在两个类中创建了两个线程,它们从第三类中调用。每个线程都有一个循环,每次循环后都会进入休眠状态。

(代码末尾)

输出为:

CHECK 0 CHECK
CHECK 1 CHECK
run one
in thread1 
CHECK 2 CHECK
run two
in thread2

1)我不知道为什么它会这样工作。我的意思是应该先打印“ CHECK 0 CHECK”。但是,为什么在线程1之前打印CHECK 1
CHECK(而在代码中调用Thread1之后才打印),而对于CHECK 2 CHECK和Thread2却一样?

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

第二种情况的输出:

CHECK 0 CHECK
CHECK 1 CHECK
run one
in thread1 
run two
in thread2

请说明为什么会这样吗?为什么方法中的线程和代码会以这种方式混淆?我想我对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");
    }
}

阅读 208

收藏
2020-10-12

共1个答案

小编典典

嗯,这是一个普遍的误解,因为Java程序本质上是单线程的,因为它们不是。当您启动Java程序时,它正在Java虚拟机中执行,该Java虚拟机将启动其他几个线程来执行您的代码。检查这个不错的博客:

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

在您的情况下,最重要的是启动一个主线程,该线程执行一个main方法。从那里开始,您将计划执行两个单独的线程Thread1和Thread2,但是您不知道什么时候OS调度程序会选择它们真正执行。由于许多原因,它不是确定性的:

  • 您不知道使用什么算法调度程序来拾取要执行的线程,
  • 您不知道处理器有多少个内核,线程可能并行或串行运行
  • 即时编译器可能会重新排列和优化您的代码,
  • CPU可能会重新安排对IO的读写,以优化代码的执行,
  • 您的代码中可能存在导致数据争用,争用条件,饥饿等的错误。

Java并发性是一个很难的话题,而我发送给您的博客条目是一个很好的起点,值得一去。如需认真阅读,请访问http://www.amazon.com/Java-
Concurrency-Practice-Brian-
Goetz/dp/0321349601。

祝好运。

2020-10-12