当前位置: 代码迷 >> Java相关 >> 多线程调用问题(望哪位有空给个详解)
  详细解决方案

多线程调用问题(望哪位有空给个详解)

热度:188   发布时间:2006-10-25 22:37:59.0
多线程调用问题(望哪位有空给个详解)
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--);
}
}
}
搜索更多相关的解决方案: 线程  详解  

----------------解决方案--------------------------------------------------------
我晕了啊 现谢谢各位达人了
----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
以下是引用韩峰在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编辑过]


----------------解决方案--------------------------------------------------------

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



麻烦你不要再做广告了.千里冰封留
----------------解决方案--------------------------------------------------------
没人理我了?
----------------解决方案--------------------------------------------------------
不是已经解释了吗?
----------------解决方案--------------------------------------------------------
this是代表当前类,也可以说类本身
----------------解决方案--------------------------------------------------------
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: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();//这个线程调用同步函数


----------------解决方案--------------------------------------------------------
  相关解决方案