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)
嗯,这是一个常见的误解,java程序本质上是单线程的,因为它们不是.当你启动一个java程序时,它正在Java虚拟机中执行,它启动了几个其他线程来执行你的代码.查看这个不错的博客:
http://blog.jamesdbloom.com/JVMInternals.html#jvm_system_threads
在你的情况下,你最重要的是,你启动一个主线程,它执行一个主方法.从那里开始两个独立的线程Thread1和Thread2,它们被安排执行,但是你不知道它们何时被OS调度程序选中以实际执行.由于许多原因,这不是确定性的:
Java并发性是一个很难的主题,我发给你的博客条目是一个很好的起点,也可以使用它.如需认真阅读,请访问http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601.
祝好运.
| 归档时间: |
|
| 查看次数: |
8447 次 |
| 最近记录: |