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

线程在Java中是如何工作的,它们的工作方式与方法中的基本代码有什么不同?,java,multithreading,Java,Multithreading,基本上,这段代码在两个类中创建了两个线程,它们是从第三个类调用的。每个线程都有一个循环,它在每次迭代后都会休眠 (代码在最后) 输出为: CHECK 0 CHECK CHECK 1 CHECK run one in thread1 CHECK 2 CHECK run two in thread2 1) 我不知道为什么会这样。我的意思是,可以先打印支票0。但为什么CHECK 1 CHECK在Thread1之前打印(而它在代码中调用Thread1之后打印),而CHECK 2 CHECK和Thre

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

(代码在最后)

输出为:

CHECK 0 CHECK
CHECK 1 CHECK
run one
in thread1 
CHECK 2 CHECK
run two
in thread2
1) 我不知道为什么会这样。我的意思是,可以先打印支票0。但为什么CHECK 1 CHECK在Thread1之前打印(而它在代码中调用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类Thread1实现可运行
{
公共线程1()
{
新线程(this.start();
}
公开募捐
{
//TODO自动生成的方法存根
System.out.println(“运行一次”);
尝试
{
对于(int i=0;i<5;i++)
{
System.out.println(“in-thread1”);
睡眠(1000);
}
}
捕获(例外e)
{
//e、 printStackTrace();
}
}
}
公共类Thread2实现了Runnable
{
公共线程2()
{
新线程(this.start();
}
公开募捐
{
//TODO自动生成的方法存根
System.out.println(“第二次运行”);
尝试
{

对于(int i=0;i我不会真正信任System.out.println()告诉我的任何系统,您是否尝试过在每次println之后调试和/或刷新System.out流

有很多因素会影响线程的执行方式,例如,在本例中,可能发生的情况是,在创建和运行Thread1时,主线程达到“CHECK 1 CHECK”点,这就是为什么它首先显示的原因

我建议您记录输出并调试代码,看看行为是否相同

让我们知道您的发现,以便我们可以帮助您


希望这有帮助(至少有一点):

我不太相信任何系统。out.println()告诉我,你有没有试过在每次println之后调试和/或刷新System.out流

有很多因素会影响线程的执行方式,例如,在本例中,可能发生的情况是,在创建和运行Thread1时,主线程达到“CHECK 1 CHECK”点,这就是为什么它首先显示的原因

我建议您记录输出并调试代码,看看行为是否相同

让我们知道您的发现,以便我们可以帮助您


希望这有帮助(至少有一点):

这是一个常见的误解,java程序本质上是单线程的,因为它们不是。 当你启动一个java程序时,它是在一个java虚拟机中执行的,这个虚拟机会启动其他几个线程来执行你的代码

在您的情况下,最重要的是,您启动一个主线程,它执行一个主方法。从那里开始,您启动两个单独的线程Thread1和Thread2,这两个线程计划执行,但您不知道操作系统调度程序何时将拾取它们以实际执行。这是不确定的,原因有很多:

  • 您不知道调度程序使用什么算法来拾取要执行的线程
  • 你不知道你的处理器有多少核,你的线程可能并行或串行运行
  • 即时编译器可能会重新排列和优化您的代码
  • CPU可能会重新安排对IO的读写,以优化代码的执行
  • 您的代码中可能存在导致数据竞争、竞争条件、饥饿等的bug
Java并发性是一个很难的话题,我发给您的博客是一个很好的开始,随它去吧。 认真阅读,请到这里


祝你好运。

这是一个常见的误解,java程序本质上是单线程的,因为它们不是。 当你启动一个java程序时,它是在一个java虚拟机中执行的,这个虚拟机会启动其他几个线程来执行你的代码

在您的情况下,最重要的是,您启动一个主线程,它执行一个主方法。从那里开始,您启动两个单独的线程Thread1和Thread2,这两个线程计划执行,但您不知道操作系统调度程序何时将拾取它们以实际执行。这是不确定的,原因有很多:

  • 您不知道调度程序使用什么算法来拾取要执行的线程
  • 你不知道你的处理器有多少核,你的线程可能并行或串行运行
  • 即时编译器可能会重新排列和优化您的代码
  • CPU可能会重新安排对IO的读写,以优化代码的执行
  • 您的代码中可能存在导致数据竞争、竞争条件、饥饿等的bug
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");
    }
}