我想测试线程同步的问题,可是,不管调用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
谢谢!!!

...全文
36 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zk21 2003-08-22
  • 打赏
  • 举报
回复
惭愧,这个都没搞懂,谢谢!!!
ludingping 2003-08-22
  • 打赏
  • 举报
回复
是的。直接调用run()会出错的。 因为run()是public , 你调用它,只是执行了里面的代码。
storm999 2003-08-22
  • 打赏
  • 举报
回复
不能直接調run()方法﹐而應用start來啟動一個線程﹐直接調run()并沒有啟動線程
从零开始讲述Java多线程的核心知识,通过板书和一步一步画图的方式,引领大家逐步去理解和掌握这些知识;并深入分析源码实现,理解背后的实现原理,知其然还要知其所以然。从多线程核心基础讲起,理解线程的风险,多种创建线程的方式;再到深入理解线程的状态;然后是线程的基本操作。系统、深入、快速上手实现多线程。 课程目标:    快速上手掌握Java多线程的经典课程,    系统、全面、深入掌握Java多线程的核心知识主讲老师:CC老师     20年Java开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者。         参与和领导了上百个大中型项目的设计和开发,在互联网应用系统架构、系统设计、    应用级框架和中间件开发等方面具有很多经验和领悟。    更为难得的是,入行20年,仍然奋战在技术一线,深知一线架构师需要掌握哪些技术、    掌握到什么程度、一线架构设计会遇到哪些坑、如何才能做最合适的架构设计,经验最难得!适应人群:    要系统、深入学习Java多线程    已有Java开发基础,要快速掌握Java多线程    补充Java多线程知识,为进入一线大厂做准备学习方式:随到随学课程内容:第一节课:系统理解Java并发编程的知识体系    1:为什么要掌握Java并发编程    2:整个课程的目标    3:整个课程的学习内容第二节课:线程必备基础知识    1:理解线程是什么,理解进程,图示    2:理解轻量级的含义    3:理解时序调度,线程是时序调度的基本单元,图示    4:理解调度方式:抢占式,图示    5:理解我们写的程序基本都是多线程的应用,图示    6:理解并发和并行,图示    7:为什么需要线程第三节课:线程的风险    1:线程安全性问题,图示    2:线程的活跃度问题:死锁、饥饿、活锁,图示    3:线程的性能问题,这里主要是线程间切换 上下文的开销第四节课:创建线程的方式之一    1: 代码演示:实现Runnable接口的方式来创建线程    2:学习Thread类的方法和属性的应用    3:学习Thread类的源码第五节课:创建线程的方式之二    1:继承Thread的方式来创建线程    2:继续学习Thread类的源码,分析线程初始化过程    3: 代码演示:演示ThreadGroup    4: 代码演示:演示daemon线程,理解daemon线程和主线程的关系第六节课:创建线程的方式之三    1: 代码演示:匿名内部类的方式来创建线程    2:继续学习Thread类的源码,分析run方法的调用过程    3:代码演示:callable的方式来创建线程,带返回值    4: 学习FutureTask的部分源码,分析run方法到call方法的调用过程第七节课:线程状态详解    1:通过Thread源码来查看线程状态的定义    2:一步一步画图,讲述状态之间的变迁第八节课:线程的基本操作sleepyield    1:阅读Thread源码    2:代码演示:sleep的使用    3:代码演示:yield的使用    4:sleepyield的对比理解第九节课:线程的基本操作join和interrupt    1:阅读Thread源码    2:代码演示:join的使用    3:代码演示:interrupt的使用这里是《Java并发编程与源码分析》的第一部分——讲述多线程核心基础实现快速上手多线程的经典之作   

62,614

社区成员

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

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