| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 858 人关注过本帖
标题:多线程调用问题(望哪位有空给个详解)
只看楼主 加入收藏
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
 问题点数:0 回复次数:9 
多线程调用问题(望哪位有空给个详解)
import java.lang.String;
class ThreadDemo6
{
public static void main(String [] args)
{
ThreadTest t=new ThreadTest();
new Thread(t).start();//这个线程调用同步代码块
try{Thread.sleep(1);}catch(Exception e){} //为什么要等待1毫秒
t.str=new String("method");//将t.str赋值使下面能调用同步函数
new Thread(t).start();//这个线程调用同步函数
}
}
class ThreadTest implements Runnable
{
private int tickets=100;
String str = new String ("");
public void run()
{
if(str.equals("method"))//调用选择
{
while(true)
{
sale();
}
}
else
{
while(true)
{
synchronized(this) //这里的this是什么作用是指向谁的啊
{
if(tickets>0)
{
try{Thread.sleep(10);}catch(Exception e){} //程序到这为什么要等待10毫秒(在多线程问题上它的执行情况是什么样的)
System.out.println(Thread.currentThread().getName()+" is saling ticket " + tickets--);
}
}
}
}
}
public synchronized void sale()
{
if(tickets>0)
{
try{Thread.sleep(10);}catch(Exception e){} //程序到这为什么也要等待10毫秒(在多线程问题上它的执行情况是什么样的)
System.out.println(Thread.currentThread().getName()+"[sale()] is saling ticket " + tickets--);
}
}
}
搜索更多相关主题的帖子: 线程 详解 
2006-10-25 22:37
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
得分:0 
我晕了啊 现谢谢各位达人了

2006-10-25 22:38
无理取闹
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:53
帖 子:4264
专家分:0
注 册:2006-7-26
收藏
得分:0 

1。为了让两个线程创建有个时间间隔
2。this就是代表自己
3。4。这两个等待10豪秒就是就是为了让你看见线程运行时的状态


win32汇编
病毒 加密
目前兴趣所在
2006-10-26 06:44
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
得分:0 
以下是引用韩峰在2006-10-26 6:44:23的发言:

1。为了让两个线程创建有个时间间隔
加了时间间隔:
Thread-0 is saling ticket 100
Thread-1[sale()] is saling ticket 99
Thread-0 is saling ticket 98
Thread-1[sale()] is saling ticket 97

两个线程就会分开一个线程调用同步函数一个线程调用同步代码块
不加时间间隔:
Thread-0[sale()] is saling ticket 100
Thread-1[sale()] is saling ticket 99
Thread-0[sale()] is saling ticket 98
Thread-1[sale()] is saling ticket 97

两个线程都去调用同步代码块了也就是说t.str=new String("method")这个语句更本就没有执行!
这是为什么(我想问的是这个)
2。this就是代表自己 //自己指的是谁
3。4。这两个等待10豪秒就是就是为了让你看见线程运行时的状态

[此贴子已经被作者于2006-10-26 10:29:21编辑过]


2006-10-26 10:28
huangs415
Rank: 1
等 级:新手上路
帖 子:102
专家分:0
注 册:2006-10-14
收藏
得分:0 

应该是调用自己啊,调用的那个程序!!



麻烦你不要再做广告了.千里冰封留
2006-10-26 10:46
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
得分:0 
没人理我了?

2006-10-27 19:24
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
不是已经解释了吗?

可惜不是你,陪我到最后
2006-10-28 11:27
tblovecj
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2006-9-20
收藏
得分:0 
this是代表当前类,也可以说类本身

2006-10-28 19:01
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
得分:0 
1。为了让两个线程创建有个时间间隔
加了时间间隔:
Thread-0 is saling ticket 100
Thread-1[sale()] is saling ticket 99
Thread-0 is saling ticket 98
Thread-1[sale()] is saling ticket 97
两个线程就会分开一个线程调用同步函数一个线程调用同步代码块
不加时间间隔:
Thread-0[sale()] is saling ticket 100
Thread-1[sale()] is saling ticket 99
Thread-0[sale()] is saling ticket 98
Thread-1[sale()] is saling ticket 97
两个线程都去调用同步代码块了也就是说t.str=new String("method")这个语句更本就没有执行!
这是为什么(我想问的是这个)

2006-10-28 22:26
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
以下是引用心动音符在2006-10-28 22:26:11的发言:
1。为了让两个线程创建有个时间间隔
加了时间间隔:
Thread-0 is saling ticket 100
Thread-1[sale()] is saling ticket 99
Thread-0 is saling ticket 98
Thread-1[sale()] is saling ticket 97
两个线程就会分开一个线程调用同步函数一个线程调用同步代码块
不加时间间隔:
Thread-0[sale()] is saling ticket 100
Thread-1[sale()] is saling ticket 99
Thread-0[sale()] is saling ticket 98
Thread-1[sale()] is saling ticket 97
两个线程都去调用同步代码块了也就是说t.str=new String("method")这个语句更本就没有执行!
这是为什么(我想问的是这个)

如果你在启动第一个线程之后,不睡一会儿的话,那就会出现两个线程在启动的时候str已经改为"method"了,你要记住,当你调用
new Thread(t).start()的时候,这个方法是立即返回的,但是这个线程并不是马上运行的,所以就会出现线程1 还没有起动的时候,t里面的str已经被改为"method"了,,然后启动第二个线程,这个时候,两个线程里面的str都是method了,所以会出现你不加间隔的情况.
因为线程的何时启动是不确定的,所以,最好是在调用启动第一个线程的时候,睡一会儿,确保线程1已经启动了,这个时候再去改t里面的数据,才能保证不会影响到线程1,然后再调用启动线程2,这样,两个线程的状态就可以保证不是一样的了
现在明白了么?
重要的一点是:线程你调用了start方法,并不代表它马上就启动了.而是要等线程调度器给它CPU时间,它才能启动.

ThreadTest t=new ThreadTest();
new Thread(t).start();//这个线程调用同步代码块
try{Thread.sleep(1);}catch(Exception e){} //为什么要等待1毫秒
t.str=new String("method");//将t.str赋值使下面能调用同步函数
new Thread(t).start();//这个线程调用同步函数


可惜不是你,陪我到最后
2006-10-29 09:47
快速回复:多线程调用问题(望哪位有空给个详解)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058876 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved