A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© masterV 中级黑马   /  2013-8-4 13:39  /  1434 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-8-7 18:10 编辑
  1. public class ThreadDemo2
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 TestThread tt = new TestThread();
  6.                 new Thread(tt).start();
  7.                 new Thread(tt).start();
  8.                 new Thread(tt).start();
  9.                 new Thread(tt).start();
  10.         }
  11. }

  12. class TestThread extends Thread
  13. {
  14.         private int ticket = 20;

  15.         public void run()
  16.         {
  17.                 while (ticket > 0)
  18.                 {
  19.                                 System.out.println(Thread.currentThread().getName() + "::" + ticket--);
  20.                 }
  21.         }
  22. }
复制代码
如上代码,既然Thread 实现了Runnable接口,而TestThread继承了Thread,那么将TestThread的对象传给Thread(Runnable target)构造函数应该可以的,但运行结果却不正确,求解。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

12 个回复

倒序浏览
由于你开的4个线程是传入的同一个ThreadTest对象,new TestThread();开辟内存空间,开线程的四个tt都指向内存中的同一区域,所以这四个线程按抢占策略共同执行tt对象所指的run方法。而不是每个线程单独执行一次。
回复 使用道具 举报
graspDN 发表于 2013-8-4 14:22
由于你开的4个线程是传入的同一个ThreadTest对象,new TestThread();开辟内存空间,开线程的四个tt都指向内 ...

Thread-2::20
Thread-3::18
Thread-4::19
Thread-1::20
Thread-4::15
Thread-3::16
Thread-2::17
Thread-3::12
Thread-4::13
Thread-4::9
Thread-1::14
Thread-4::8
Thread-3::10
Thread-2::11
Thread-3::5
Thread-4::6
Thread-1::7
Thread-4::2
Thread-3::3
Thread-2::4
Thread-1::1
运行结果不正常啊关键是,顺序不正常我能理解,但是数值不正常我不能理解
回复 使用道具 举报
魏先勇 发表于 2013-8-4 14:26
Thread-2::20
Thread-3::18
Thread-4::19

这个毕老师的视频里提到过,好像是没什么影响的。
回复 使用道具 举报
魏先勇 发表于 2013-8-4 14:26
Thread-2::20
Thread-3::18
Thread-4::19

假如线程1执行到 ticket--后还没打印就被另一个线程打印了,另一个线程可能顺利打印也可能被另一个线程抢占,所以打印顺序不一定啊
回复 使用道具 举报
graspDN 发表于 2013-8-4 14:35
假如线程1执行到 ticket--后还没打印就被另一个线程打印了,另一个线程可能顺利打印也可能被另一个线程抢 ...

出现了两次20你发现了没,实现Runnable接口就不会出现这个现象
回复 使用道具 举报
魏先勇 发表于 2013-8-4 14:41
出现了两次20你发现了没,实现Runnable接口就不会出现这个现象

ticket--改成--ticket试试
回复 使用道具 举报
graspDN 发表于 2013-8-4 15:40
ticket--改成--ticket试试

0.0明显是不行的。。。。
回复 使用道具 举报
魏先勇 发表于 2013-8-4 16:23
0.0明显是不行的。。。。

当某一线程就来,假设此时ticket=20; 按照你思路,第一步是打印,第二步是输出,当这个线程第一步完成时候被抢占,另一个线程同样第一步是打印,第二步是输出,这是打印的也是20。
线程同步问题,有两个动作,随时都会被抢占,你自己好好理理关系。

点评

没看懂,感觉你这块也没理解透彻,不过还是谢谢你  发表于 2013-8-4 19:48
回复 使用道具 举报
多线程的创建过程:
1,继承Thread类,创建Thread子类对象,调用start方法。
2,实现Runnable接口,创建本类对象,创建Thread类对象,将本类对象作为参数传递给Thread类对象,Thread类对象调用start方法,调用run方法。

楼主的代码:本类继承了Thread类,那么直接创建本类对象调用start方法就可以了。

与你一同学习!{:soso_e141:}
回复 使用道具 举报
王松松 发表于 2013-8-5 00:50
多线程的创建过程:
1,继承Thread类,创建Thread子类对象,调用start方法。
2,实现Runnable接口,创建 ...

这个我知道,就是在练习的时候不小心写成这样了,就出问题了,想搞清楚咋回事。嘿嘿
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马