JAVA CODE:class Machine extends Thread
{
public void run()
{
for(int a=0;a<20;a++)
System.out.println(currentThread().getName()+":"+a);
/*try
{
sleep(10);
}catch(InterruptedException e)
{
throw new RuntimeException(e);
}*/
}
public static void main(String[] args)
{
Machine machine1 = new Machine();
Machine machine2 = new Machine();
machine1.setName("m1");
machine2.setName("m2");
machine1.start();
machine2.start();
//machine1.run();
}
}
{
public void run()
{
for(int a=0;a<20;a++)
System.out.println(currentThread().getName()+":"+a);
/*try
{
sleep(10);
}catch(InterruptedException e)
{
throw new RuntimeException(e);
}*/
}
public static void main(String[] args)
{
Machine machine1 = new Machine();
Machine machine2 = new Machine();
machine1.setName("m1");
machine2.setName("m2");
machine1.start();
machine2.start();
//machine1.run();
}
}
解决方案 »
- 各位大虾帮忙看看java.lang.NoClassDefFoundError: org/springframework/beans/factory/config
- 紧急求助:socket编程问题:怎样在关闭一个数据流的情况下,不关闭socket
- 帮忙看下 hibernate+MYSQL的错误
- java 运行时问题
- 怎样在tooltip中实现换行的效果?
- 关于JTextArea中内容显示刷新的问题
- 哪里查找com.borland.dx.sql.dataset中的所有方法
- 问个JB8的简单问题
- jbuilder8 enterprise注册码or注册机!!!!谁有啊??有的话帮个忙!谢谢!!
- 我去哪里下载fort?
- 怎样判断jsp中某个多选框有没有选中
- 为什么在for循环中x[1][size]!=13呢?
1,因为线程的启动是需要时间
2,java中的线程是抢占式的.machine1 和 machine2都是由主线程启动的.的当machine1.start启动的时候
machine2线程还没有启动所以.
m1先执行. m1执行一段时间后主线程把m2启动所以m2开始执行.
优先级相同的情况下会轮流执行的。
你先调用machine1.start()方法,machine1会先执行run方法,具体cpu怎么让给machine2的问题,我也在这关注把
这个就是操作系统调度的问题当然如果优先级一样的话machine1一直占用cpu 显然她不会把控制权交给2 个人理解
m1:0
m1:1
m1:2
m1:3
m2:0
m2:1
m2:2
m2:3
m2:4
m2:5
m2:6
m2:7
m2:8
m2:9
m2:10
m2:11
m2:12
m2:13
m2:14
m2:15
m2:16
m2:17
m2:18
m2:19
m1:4
m1:5
m1:6
m1:7
m1:8
m1:9
m1:10
m1:11
m1:12
m1:13
m1:14
m1:15
m1:16
m1:17
m1:18
m1:19m1和m2优先级不是一样吗?
不是轮流执行,线程的执行会由jvm去分配,至于怎么分配,只有天知道了。jvm会划分时间段,某个时间段内做线程1,某个时间段做线程2,并不会等线程1执行完再执行线程2
但是你先调用mi的start()方法,要不你把m1和m2的start方法换过来看看。
至于内部究竟是不是 先来先服务 还是时间片没研究过
也不能这么说。
准确的说,Java的线程调度机制是抢占式的,只要他认为有必要,就会中断现在的线程,
然后资源就由另一个幸运的线程占有并执行。这一切并不是我们可以控制的。楼主你看到的结果只不过是在你机器上的那个环境下的结果,
当换了一个环境的时候,结果就会不一样。不知道我这么说你可了解
public static void main(String[] args) {
ThreadTest1 machine1 = new ThreadTest1();
ThreadTest2 machine2 = new ThreadTest2();
machine1.start();
machine2.start();
}
}
class ThreadTest1 extends Thread {
public void run() {
while (true) { }
}
}
class ThreadTest2 extends Thread {
public void run() {
System.out.println("11111");
}
}这个肯定就可以看出来了 是一个执行一会儿 应为他始终会去输出11111
“在抢占式线程模型中,操作系统可以在任何时候打断线程。通常会在它运行了一段时间(就是所谓的一个时间片)后才打断它。这样的结果自然是没有线程能够不公平地长时间霸占处理器。然而,随时可能打断线程就会给程序开发员带来其他麻烦。同样使用办公室的例子,假设某个职员抢在另一人前使用复印机,但打印工作在未完成的时候离开了,另一人接着使用复印机时,该复印机上可能就还有先前那名职员留下来的资料。抢占式线程模型要求线程正确共享资源,协作式模型却要求线程共享执行时间。由于 JVM 规范并没有特别规定线程模型,Java 开发员必须编写可在两种模型上正确运行的程序。在了解线程以及线程间通讯的一些方面之后,我们可以看到如何为这两种模型设计程序。”
所以在其他地方执行结果每次都会不一样
如果加上你屏蔽的代码,结果就有n种可能了
因为sleep了线程1,但是由于它非常短,所以可能已经执行完成了