楼主: ross1025

求助 关于多线程的入门问题

[复制链接]
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
11#
发表于 2007-6-30 12:22 | 只看该作者
请仔细看代码......

当在run方法内部声明一个变量时,它就是一个局部变量,每一个生成的线程都有一份独立的该变量,所以运行的时候自然是4个一百张票,没什么可以怀疑的,也和线程优先级以及系统随机状况无关。

如果在run方法外部声明一个实例变量,由于生成的所有线程都是以同一个ThreadTest对象为基础的(也就是说所有线程的软方法其实都是在调用同一个ThreadTest的run方法),所以才可以达到所有线程共用一个变量的效果。

声明为static当然也可以同样的效果,不过有点儿过头了,yining老哥好像也差点儿被绕进去,呵呵

使用道具 举报

回复
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
12#
发表于 2007-6-30 12:33 | 只看该作者
另外要说的是......


1、请务必仔细看书,仔细看代码

2、抱着审视的态度看书,尽信书,则不如无书,尤其是IT出版业鱼龙混杂的今天......  且不说这样的错误委实不应该,仔细看一看那个while(true),当票卖完了,线程为什么不停止呢,有没有发现票卖完以后CPU使用率上到100%?这已经不可能是排版的错误了......

使用道具 举报

回复
论坛徽章:
55
生肖徽章:虎
日期:2006-09-06 21:14:232011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
13#
发表于 2007-6-30 22:55 | 只看该作者
最初由 greenflute 发布
[B]请仔细看代码......

当在run方法内部声明一个变量时,它就是一个局部变量,每一个生成的线程都有一份独立的该变量,所以运行的时候自然是4个一百张票,没什么可以怀疑的,也和线程优先级以及系统随机状况无关。

如果在run方法外部声明一个实例变量,由于生成的所有线程都是以同一个ThreadTest对象为基础的(也就是说所有线程的软方法其实都是在调用同一个ThreadTest的run方法),所以才可以达到所有线程共用一个变量的效果。

声明为static当然也可以同样的效果,不过有点儿过头了,yining老哥好像也差点儿被绕进去,呵呵 [/B]


呵呵呵。错看成每个线程创建一个新的ThreadTest了,所以我的第一反应是那个tickets应该是静态的类变量。

楼主,greenflute说的很正点。思考东西的时候要搞清楚原理,才能正确的去判断程序的执行状况。

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2007-7-1 10:18 | 只看该作者
非常感谢 greenflute 和  yining 两位大侠的点拨,现在我明白问题所在了,

但是,如果我在run方法内声明tickets为static的,尝试后编译无法通过,我想是不是因为静态的变量必须在静态的方法中才能定义?

但是这个run方法因为是从Runnable 继承实现的,又不能定义为static,我想请教下如何才能通过static来实现打印同100张票呢?

当然我知道这样是在绕大圈,只要把tickets放到run方法外就可以了,但是我想弄明白static的用法,另外我知道static定义过的变量在运行时会优先运行且仅仅运行这一遍,也就是说这个变量的值只有这一个,不知我说的对吗?

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
15#
发表于 2007-7-1 11:09 | 只看该作者
基础语法还没搞好, 就来搞多线程,

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
16#
发表于 2007-7-1 11:11 | 只看该作者
static变量当然是到处都可以被访问拉。不一定是在statci方法里。
你定义的那个类里就可以定义一个static的然后所有的线程都去用他

使用道具 举报

回复
论坛徽章:
0
17#
 楼主| 发表于 2007-7-1 11:42 | 只看该作者
最初由 justforregister 发布
[B]static变量当然是到处都可以被访问拉。不一定是在statci方法里。
你定义的那个类里就可以定义一个static的然后所有的线程都去用他 [/B]


这个,在类里定义成静态的成员变量当然是可以的,我是想知道能否在run方法内定义一个静态的tickets,使得多线程所访问的是同一个tickets变量?

恩恩,不要怪俺钻牛角尖,呵呵,俺只是想知道这样是否可行而已。

另外,版主教训的对,俺的基础确实没打好,这不正在补习嘛~呵呵

再次感谢以上所有朋友的指点,并希望各位大侠能不吝赐教~!

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
18#
发表于 2007-7-1 16:05 | 只看该作者
不是你钻牛角尖  ,你对程序编程的理解有点问题,
要实现你那样的想法也可以。 定义一个类他有一个static的成员变量。 那样你在run方法里访问那个类的一个实例

使用道具 举报

回复
论坛徽章:
94
会员2007贡献徽章
日期:2007-09-26 18:42:102013年新春福章
日期:2013-02-25 14:51:24鲜花蛋
日期:2013-01-17 10:14:19ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20蛋疼蛋
日期:2011-11-09 14:19:52蛋疼蛋
日期:2011-08-11 09:31:52蛋疼蛋
日期:2011-08-08 11:05:52双黄蛋
日期:2011-07-06 15:15:11蛋疼蛋
日期:2011-06-29 13:02:442010广州亚运会纪念徽章:帆船
日期:2011-03-29 14:26:18
19#
发表于 2007-7-1 23:17 | 只看该作者
学习了

使用道具 举报

回复
论坛徽章:
4
生肖徽章:牛
日期:2007-05-07 05:31:44ERP板块每日发贴之星
日期:2007-05-21 01:02:55设计板块每日发贴之星
日期:2007-05-23 01:04:28会员2007贡献徽章
日期:2007-09-26 18:42:10
20#
发表于 2007-7-2 15:56 | 只看该作者

Re: 求助 关于多线程的入门问题

最初由 ross1025 发布
[B]按照教材编写了如下程序:
class ThreadDemo1
{
     public static void main(String [] args)
     {
                ThreadTest tt=new ThreadTest();
         new Thread(tt).start();
         new Thread(tt).start();
         new Thread(tt).start();
         new Thread(tt).start();
     }       
}
class ThreadTest implements Runnable
{
   public void run()
   {

     int tickets=100;
     while(true)
     {
       if (tickets>0)   

       System.out.println(Thread.currentThread().getName()+ "is saling tickets "+tickets--);                                                   
     }
   }
}

教材上说这样的运行结果是4个线程同时运行这个run方法,并且打印结果应该是4个线程出售同一个100张票,即不会出现多个线程卖出同一张票的情况,
但是我实际的运行结果却是4个线程都存在卖出同一张ticket的情况,请教各位路过的大侠原因,非常感激! [/B]


厉害。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表