为什么出来是:3 完成
1 完成
2 完成
class One {
synchronized void display(int num) {
try {
System.out.print(""+num);
Thread.sleep(1000);
}
catch(InterruptedException e) {
System.out.println("中断");
}
System.out.println(" 完成");
}
}
class Two implements Runnable {
int number;
One one;
Thread t;
public Two(One one_num, int n) {
one = one_num;
number = n;
t=new Thread(this);
t.setPriority(n);
t.start();
}
public void run() {
one.display(number);
}
}
public class Sample08Synchronized {
public static void main(String args[]) {
try {
One one=new One();
int digit=1;
Two s1=new Two(one,digit++);
Two s2=new Two(one,digit++);
Two s3=new Two(one,digit++);
s1.t.join();
s2.t.join();
s3.t.join();
}
catch(InterruptedException ie) {
System.out.println("线程意外终止");
}
}
}
1 完成
2 完成
class One {
synchronized void display(int num) {
try {
System.out.print(""+num);
Thread.sleep(1000);
}
catch(InterruptedException e) {
System.out.println("中断");
}
System.out.println(" 完成");
}
}
class Two implements Runnable {
int number;
One one;
Thread t;
public Two(One one_num, int n) {
one = one_num;
number = n;
t=new Thread(this);
t.setPriority(n);
t.start();
}
public void run() {
one.display(number);
}
}
public class Sample08Synchronized {
public static void main(String args[]) {
try {
One one=new One();
int digit=1;
Two s1=new Two(one,digit++);
Two s2=new Two(one,digit++);
Two s3=new Two(one,digit++);
s1.t.join();
s2.t.join();
s3.t.join();
}
catch(InterruptedException ie) {
System.out.println("线程意外终止");
}
}
}
解决方案 »
- 求解
- 怎么读取控制台输入的double型数据?
- java初学视频有什么好介绍
- 如何用java实现寻找应用软件的安装路径
- 帮帮忙,如何在JTree的节点上单击右键弹出一个菜单
- 请问哪儿有J2SE的源码下载???
- 关于版本和bug管理的rule(规则)的编写
- 在Applet中,如何使加载在按钮上的图标,随着按钮的每次单击而使该图标旋转一定的角度,急,请高手赐教!
- tomcat里面有没有定时执行的服务?或者怎样自己编写?
- 关于java应用程序如何应用在各种无java编译器的平台上的问题?
- java的C/S程序怎样得到网络WEB服务器上的某个目录中的所有文件
- Statement执行SQL语句时遇到的日期格式难题
s2.t.join();
s3.t.join();顺序改一下,得到的结果会不一样吧
而java虚拟机是不支持时间片的,只支持剥夺的方式,但是操作系统支持那么他在优先级等同的情况下那么机制就随操作系统。在win下也有线程的优先级,如果线程优先级不一样的情况下,是否低优先级就得不到执行呢?答案是否定的,也就是说为什么你的程序为什么先出3,而下次出1了,最后才出2的情况。显然优先级最高的是3,但是1是最先进入等待状态的,但是等main的线程时间片结束后,3的优先级最高,所以s3执行,s3的时间片到期后,等待的线程有s1,和s2,这里s1是最先等待的,虽然优先级别比s2低1级,但是低优先级的线程通用有机会获取运行状态,这里他就得到了执行,所以出的是1,最后是2。至于低优先级是如何获取运行的时刻,我们就不必理会,知道就行。你可以做一个实验:把代码这样改一下就知道了。
Two s1=new Two(one,1);
Two s2=new Two(one,3);
Two s3=new Two(one,5);