一个很简单的线程 就是有点不明白

new_class 2008-04-16 01:28:32
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();
}
}
...全文
339 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
jakocoo 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 maxwell851023 的回复:]
主线程只负责启动分线程,至于启动以后分线程里面做什么,它不管,这也正是线程和一般方法的不同。
多线程都启动了以后,各个线程里面是随机分配时间片的
所以再不同配置的机器上,运行结果也是不同的
[/Quote]
不是随机分配时间片的!是根据JVM的线程调度算法和线程的优先级来进行调度的。
rubysun2008 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 new_class 的回复:]
不是应该运行完m1再运行m2吗
[/Quote]
如果你把run方法同步,才有这种效果...不然,你以为线程是什么?
maxwell851023 2008-04-17
  • 打赏
  • 举报
回复
主线程只负责启动分线程,至于启动以后分线程里面做什么,它不管,这也正是线程和一般方法的不同。
多线程都启动了以后,各个线程里面是随机分配时间片的
所以再不同配置的机器上,运行结果也是不同的
baichunjian 2008-04-16
  • 打赏
  • 举报
回复
jvm是个很奇怪的东西,你在程序中在加一个machine3看看
J_Factory 2008-04-16
  • 打赏
  • 举报
回复
建议lz不要看国内的书,你应该把线程看出是并行的,但cup在一个时间只能有一个线程,所以当线程开启之后,如果优先级相同线程之间得到cup的概率是相等的,这种抢占式方法并没有什么轮流得,从同个程序在不同机器上得到不同结果就可以看出
tiger861111 2008-04-16
  • 打赏
  • 举报
回复
就这个程序而言,应该是先执行machine1,再执行machine2的
如果加上你屏蔽的代码,结果就有n种可能了
因为sleep了线程1,但是由于它非常短,所以可能已经执行完成了
assdust110 2008-04-16
  • 打赏
  • 举报
回复
首先,你要了解时间片这个概念。

然后,你要理解多线程。明白多线程的原理

这些资料 在网络上都比较好找,自己找来看下就OK了
唯一者 2008-04-16
  • 打赏
  • 举报
回复
这是个线程调度问题,除了主线程外还有两个生成的线程,这三个线程都会被带到CPU的线程等待队列中,至于怎样调度完全取决于操作系统的调度方式,一般来说,同一等级的线程会按照时间片断不确定地执行。
oogamiyiqilou 2008-04-16
  • 打赏
  • 举报
回复
他们是靠cpu分配时间来执行的
所以在其他地方执行结果每次都会不一样
new_class 2008-04-16
  • 打赏
  • 举报
回复

“在抢占式线程模型中,操作系统可以在任何时候打断线程。通常会在它运行了一段时间(就是所谓的一个时间片)后才打断它。这样的结果自然是没有线程能够不公平地长时间霸占处理器。然而,随时可能打断线程就会给程序开发员带来其他麻烦。同样使用办公室的例子,假设某个职员抢在另一人前使用复印机,但打印工作在未完成的时候离开了,另一人接着使用复印机时,该复印机上可能就还有先前那名职员留下来的资料。抢占式线程模型要求线程正确共享资源,协作式模型却要求线程共享执行时间。由于 JVM 规范并没有特别规定线程模型,Java 开发员必须编写可在两种模型上正确运行的程序。在了解线程以及线程间通讯的一些方面之后,我们可以看到如何为这两种模型设计程序。”
new_class 2008-04-16
  • 打赏
  • 举报
回复

“在抢占式线程模型中,操作系统可以在任何时候打断线程。通常会在它运行了一段时间(就是所谓的一个时间片)后才打断它。这样的结果自然是没有线程能够不公平地长时间霸占处理器。

可能就是这个原因吧

和操作系统有关

同意13楼的
new_class 2008-04-16
  • 打赏
  • 举报
回复
我知道是一个执行一会再换另外一个 可是我不知道其中的原理啊
new_class 2008-04-16
  • 打赏
  • 举报
回复
我在看孙卫琴的书

看到好几个关于线程的程序

学到yield(),sleep()。。。。。好几个中断线程的方法 然后想到我上面写的这个程序 就想到程序根本就每调用暂停线程的方法 当前正在执行的线程就暂时中断了呢

谢谢你的答案了 但我还是有点不明白 还是得想想
liluyemin 2008-04-16
  • 打赏
  • 举报
回复
public class ThreadTest {
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
Cspider588 2008-04-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 new_class 的回复:]
也就是说jvm先把定义好的线程的时间片分配好 然后在run
[/Quote]

也不能这么说。
准确的说,Java的线程调度机制是抢占式的,只要他认为有必要,就会中断现在的线程,
然后资源就由另一个幸运的线程占有并执行。

这一切并不是我们可以控制的。

楼主你看到的结果只不过是在你机器上的那个环境下的结果,
当换了一个环境的时候,结果就会不一样。

不知道我这么说你可了解
oujing 2008-04-16
  • 打赏
  • 举报
回复
x学习
liluyemin 2008-04-16
  • 打赏
  • 举报
回复
而且我觉得 你在输出的时候调用了io设备。这个时候cpu空闲 也肯定回去执行其他线程。
至于内部究竟是不是 先来先服务 还是时间片没研究过
anqini 2008-04-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 new_class 的回复:]
可是我运行的时候结果是
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:19

m1和m2优先级不是一样吗?
[/Quote]

但是你先调用mi的start()方法,要不你把m1和m2的start方法换过来看看。
anqini 2008-04-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 Cspider588 的回复:]
引用 2 楼 new_class 的回复:
忘了提问题了

线程machine1和machine2是轮流执行run方法吗?还是等machine1执行完了在执行machine2呢?如果是前者,当线程machine1执行的时候,怎么会把cpu让给machine2呢,它本身还没执行完毕啊?


不是轮流执行,线程的执行会由jvm去分配,至于怎么分配,只有天知道了。

jvm会划分时间段,某个时间段内做线程1,某个时间段做线程2,

并不会等线程1执行完再执行线程2
[/Quote]
这个不是轮流执行那是什么。。。轮流不一定是你一次我一次。。。
new_class 2008-04-16
  • 打赏
  • 举报
回复
也就是说jvm先把定义好的线程的时间片分配好 然后在run
加载更多回复(15)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧