我想测试线程同步的问题,可是,不管调用yield()还是sleep(),线程都不让出使用权,怎么回事呢?

zk21 2003-08-22 02:28:18
public class SynchronizeTest {
public static void main(String arg[]) {
SynchronizeTest mother = new SynchronizeTest();
Thread1 t1 = mother.new Thread1();
Thread2 t2 = mother.new Thread2();
Thread3 t3 = mother.new Thread3();
SObject so = mother.new SObject();
t1.setSo(so);
t2.setSo(so);
t3.setSo(so);
t3.setPriority(t3.getThreadGroup().getMaxPriority());
t1.run();
//t2.run();
t3.run();

}
class SObject {
synchronized public void sm1() {
int value = 0;
for (int i = 0; i < 10; i++) {

System.out.println("in synm 1,begin...");
Thread.yield();
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
System.out.println("in synm 1,end");
}
}
synchronized public void sm2() {
int value = 0;
for (int i = 0; i < 10; i++) {

System.out.println("in synm 2");
}
//Thread.yield();
}
public void usm1() {
int value = 0;
for (int i = 0; i < 10; i++) {

System.out.println("in Usynm 1,begin...");

// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }

System.out.println("in Usynm 1,end");
}
}
public void usm2() {
int value = 0;
for (int i = 0; i < 10; i++) {

System.out.println("in Usynm 2");
//Thread.yield();}
}
}
}
class Thread1 extends Thread {
SObject so;
public void setSo(SObject object) {
so = object;
}
public void run() {
yield();
while (true) {
so.usm1();
}
}
}

class Thread2 extends Thread {
SObject so;
public void setSo(SObject object) {
so = object;
}
public void run() {
yield();
while (true) {
so.sm2();
}
}
}

class Thread3 extends Thread {
SObject so;
public void setSo(SObject object) {
so = object;
}
public void run() {
yield();
while (true) {
so.usm2();
}
}
}
}
输出却总是这样:in Usynm 1,begin...
in Usynm 1,end
in Usynm 1,begin...
in Usynm 1,end
in Usynm 1,begin...
in Usynm 1,end
in Usynm 1,begin...
in Usynm 1,end
in Usynm 1,begin...
in Usynm 1,end
谢谢!!!

...全文
35 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zk21 2003-08-22
  • 打赏
  • 举报
回复
惭愧,这个都没搞懂,谢谢!!!
ludingping 2003-08-22
  • 打赏
  • 举报
回复
是的。直接调用run()会出错的。 因为run()是public , 你调用它,只是执行了里面的代码。
storm999 2003-08-22
  • 打赏
  • 举报
回复
不能直接調run()方法﹐而應用start來啟動一個線程﹐直接調run()并沒有啟動線程

62,614

社区成员

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

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