最近在看张孝祥的视频教程,其中在讲进程的时候有这样一个例子,原代码是这样的:
import java.*;
import java.lang.Thread.*;
import java.lang.*;class ThreadDemo {
public static void main(String[] args)
{
TestThread tt = new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class TestThread implements Runnable
{
public void run()
{
int tickets=100;
String str = new String("");
while(true)
{
synchronized(str)
{
if(tickets>0)
{
try{ Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"is selling ticket "+tickets--);
}
}
}
}
}
他在演示时可以实现4个进程对同一个tickets进行操作,也就是说当前一个进程调用了tickets后它的值为5,那么紧接着的下一个进程调用时就是在5的基础上。
但是我在自己电脑上调试时,却达不到这个效果,我运行后的结果是;4个进程各自调用一个tickets,也就是总共调用了4个tickets,并未达到调用同一个tickets。
这个例子的实际问题是车站买票问题。
想请教各位高手这是为什么,为什么达不到他演示时的效果?是不是JDK版本不一样,Runnable接口的实现也不一样?
import java.*;
import java.lang.Thread.*;
import java.lang.*;class ThreadDemo {
public static void main(String[] args)
{
TestThread tt = new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class TestThread implements Runnable
{
public void run()
{
int tickets=100;
String str = new String("");
while(true)
{
synchronized(str)
{
if(tickets>0)
{
try{ Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"is selling ticket "+tickets--);
}
}
}
}
}
他在演示时可以实现4个进程对同一个tickets进行操作,也就是说当前一个进程调用了tickets后它的值为5,那么紧接着的下一个进程调用时就是在5的基础上。
但是我在自己电脑上调试时,却达不到这个效果,我运行后的结果是;4个进程各自调用一个tickets,也就是总共调用了4个tickets,并未达到调用同一个tickets。
这个例子的实际问题是车站买票问题。
想请教各位高手这是为什么,为什么达不到他演示时的效果?是不是JDK版本不一样,Runnable接口的实现也不一样?
解决方案 »
- 大哥们,小弟面临人生抉择,求助(我还不想去富士康)
- jfreechart如何画三维曲线图
- 这段代码为什么有这样的问题?
- 在线等!一个莫名其妙的问题!!!!!
- 两个线程同时进行可能么?
- Java中排序
- 请问这是什么问题?Exception in thread "main" java.lang.NoClassDefFoundError: \java\jframedemo/class
- 用JB如何调试纯java语句呀?我刚学java只要能知道运动结果就行了
- 为什么setText 不会即时刷新?
- 哪里有基于JAVA对路由器设备编程的资料
- Properties类的问题,我怎么也保存不了对文件的修改 怎么了呀?
- 如何方便实现对象列表的存取(文件操作)。
都放在run()外面;
一个new Thread(tt).start();调用一次run();
若在里面的话每调用一次重复int tickets=100;String str = new String("");一次