一个关于线程的问题

DAXIANG84 2006-10-18 11:15:59
public class ThreadSyncDemo2{
public static void main(String []args){
ThreadTest t=new ThreadTest();
new Thread(t).start();
new Thread(t).start();
}
}
class ThreadTest implements Runnable{
private int tickets=100;
public void run(){
while(true){
synchronized(this){
if(tickets>0){
try{
Thread.sleep(3000);
}
catch(Exception e){
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()+"正在买第"+tickets--+"号票");
}
}
}
}
}
问题:执行中,两个线程是不断交替运行的,但是我在代码中怎么没找到使县城交替运行的代码?难道线程的交替是默认完成的?
...全文
190 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
DAXIANG84 2006-10-23
  • 打赏
  • 举报
回复
1、 去掉synchronized(this)后,两个线程的输出貌似是同时刷出来的,sleep(3000)只执行了一次,可是有两个线程调用run(),那么sleep(3000)也应该被调用两次吧,那么两个线程输出结果时,应该有间隔吧?
2、 sleep(3000)在run()中是写在println()之前的,与线程交替运行好像没有什么关系吧。
3、 最困惑的问题:第一个线程执行完run()后,线程是什么状态?它为什么要等待第二个线程执行run()后才继续执行run()?第一个线程为什么不一直使自己run下去?

各位大虾,HELP!!
「已注销」 2006-10-18
  • 打赏
  • 举报
回复
问题的关键在
synchronized(this)
第一个线程锁定了当前对象
第二个线程执行到这里的时候就暂停下来等待当前对象解锁之后才继续运行
而在第一个线程执行完成之后,tickets也就递减到0了
第二个线程中的代码条件不满足,不再输出信息
去掉synchronized(this)这句之后
就可以看到所谓的线程交互运行的情况了
haisenmai 2006-10-18
  • 打赏
  • 举报
回复
操作系统使然.详情看孙鑫的视频
非常好看的
aouzo 2006-10-18
  • 打赏
  • 举报
回复
因为thread时启动后是相互竞争的关系,也就是说线程间竞争启动,而Thread.sleep(3000);是暂停本线程,以便其他线程有机会启动
skyer_lei 2006-10-18
  • 打赏
  • 举报
回复
public static void main(String []args){
ThreadTest t=new ThreadTest();
new Thread(t).start();
new Thread(t).start();
}
}
中,俩个new Thread(t).start()就说明了两个线程是不断交替运行的.
DAXIANG84 2006-10-18
  • 打赏
  • 举报
回复
To haisenmai(我应该做的到):
孙鑫的视频?在哪里能下的到?
DAXIANG84 2006-10-18
  • 打赏
  • 举报
回复
1、 去掉synchronized(this)后,两个线程的输出貌似是同时刷出来的,sleep(3000)只执行了一次,可是有两个线程调用run(),那么sleep(3000)也应该被调用两次吧,那么两个线程输出结果时,应该有间隔吧?
2、 sleep(3000)在run()中是写在println()之前的,与线程交替运行好像没有什么关系吧。
3、 最困惑的问题:第一个线程执行完run()后,线程是什么状态?它为什么要等待第二个线程执行run()后才继续执行run()?第一个线程为什么不一直使自己run下去?

62,628

社区成员

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

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