基本上,此代码在两个类中创建了两个线程,它们从第三类中调用。每个线程都有一个循环,每次循环后都会进入休眠状态。
(代码末尾)
输出为:
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"); } }
嗯,这是一个普遍的误解,因为Java程序本质上是单线程的,因为它们不是。当您启动Java程序时,它正在Java虚拟机中执行,该Java虚拟机将启动其他几个线程来执行您的代码。检查这个不错的博客:
http://blog.jamesdbloom.com/JVMInternals.html#jvm_system_threads
在您的情况下,最重要的是启动一个主线程,该线程执行一个main方法。从那里开始,您将计划执行两个单独的线程Thread1和Thread2,但是您不知道什么时候OS调度程序会选择它们真正执行。由于许多原因,它不是确定性的:
Java并发性是一个很难的话题,而我发送给您的博客条目是一个很好的起点,值得一去。如需认真阅读,请访问http://www.amazon.com/Java- Concurrency-Practice-Brian- Goetz/dp/0321349601。
祝好运。