黑马程序员技术交流社区
标题:
关于多线程的一个小问题
[打印本页]
作者:
葛奎
时间:
2012-6-18 19:34
标题:
关于多线程的一个小问题
class sellTicket extends Thread
{
private static int tick=100;
public void run()
{
Object obj=new Object();
while(true)
{
synchronized(obj)
{
if(tick>0)
{//像毕老师说的,当Thread-0进来时,其他的线程就进不来了.依次类推
try{Thread.sleep(10);} catch(Exception e){}//也就是说这种情况下不可能出现0,-1,-2的情况.
//
但是执行到这句话时候,还是出现了0,-1的情况.把这句去掉就正确了 这是为什么啊?
System.out.println(getName()+" "+tick--);
}
}
}
}
}
class ThreadTest2
{
public static void main(String[] args)
{
sellTicket st=new sellTicket();
sellTicket st2=new sellTicket();
sellTicket st3=new sellTicket();
st.start();
st2.start();
st3.start();
}
}
作者:
黑马—陈磊
时间:
2012-6-18 19:47
本帖最后由 黑马—陈磊 于 2012-6-18 20:16 编辑
可以这样修改:
class sellTicket implements Runnable
{
private static int tick=100;
Object obj=new Object(); //run方法应放在外边(你的放在了run方法里),不然每次执行run方法都会new一个obj对象
public void run()
{
while(true)
{
synchronized(obj)
{
if(tick>0)
{
try{Thread.sleep(10);} catch(Exception e){}
System.out.println(Thread.currentThread().getName()+" "+tick--);
}
}
}
}
}
class Test
{
public static void main(String[] args)
{
sellTicket st=new sellTicket();
// sellTicket st2=new sellTicket();
// sellTicket st3=new sellTicket();
// st.start();
// st2.start();
// st3.start();
Thread st1=new Thread(st);
Thread st2=new Thread(st);
Thread st3=new Thread(st);
st1.start();
st2.start();
st3.start();
}
}
作者:
唐辉辉
时间:
2012-6-18 20:11
这里就要讲到创建多线程的第二种方式了:
实现Runable接口:此种方式用于多个线程执行同一资源. 程序已更改,请楼主参考:
class sellTicket implements Runnable {
private int tick = 1000;
Object obj = new Object();
public void run() {
while (true) {
synchronized (obj) {
if (tick > 0) {// 像毕老师说的,当Thread-0进来时,其他的线程就进不来了.依次类推
try {
Thread.sleep(10);
} catch (Exception e) {
}// 也就是说这种情况下不可能出现0,-1,-2的情况.
// 但是执行到这句话时候,还是出现了0,-1的情况.把这句去掉就正确了 这是为什么啊?
System.out.println(Thread.currentThread().getName() + " " + tick--);
}
}
}
}
}
class Demo1{
public static void main(String[] args) {
sellTicket st = new sellTicket();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
Thread t3 = new Thread(st);
t1.start();
t2.start();
t3.start();
}
}
作者:
陌花╮有意、
时间:
2012-6-18 20:17
首先这句代码
Object obj = new Object();应该放在run()方法外边,另外像这种具有共享数据的多线程应该使用继承Runnable接口
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2