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

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

(代码到底)

输出是:

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

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

2)如果我用System.exit(0)替换CHECK 2 CHECK,就像上面的情况一样,在运行Thread2之前打印CHET 2 CHECK(它是Thread2旁边),为什么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"); } } 

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

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

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

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

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

祝你好运。

我不会真的相信System.out.println()告诉我,你是否尝试过调试和/或在每次println后刷新System.out流?

有许多因素会影响线程的执行方式,例如,在这种情况下可能发生的是,在创建并运行Thread1时,主线程达到“CHECK 1 CHECK”点,并且这就是它首先展示的原因。

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

让我们知道您发现了什么,以便我们为您提供帮助。

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

您无法预测线程将执行的顺序,除非您控制它们的执行(使用锁,互斥,信号量和连接等机制)。

我认为您需要更多关于并发编程的知识。

这里有一些有用的链接

维基百科的并发页面

oracle的教程 (恕我直言,这是非常好的教程)

线程的执行非常随机 。 你可以控制执行(通过同步和所有)。 有关更好的理解,请参阅docs.oracle。