本人在学java,在学到线程的时候,遇到了一个问题,希望有高手能帮我解决。 这是一个正确的模拟多站点卖票

[复制链接]
查看11 | 回复5 | 2011-8-8 13:48:31 | 显示全部楼层 |阅读模式
的程序,是我在某个视频教程里复制的,但运行结果却令我很困惑。
程序是:
class A implements Runnable
{
        public int tickets = 100;
        String str = new String("哈哈");
               
        public void run()
        {
                String str = "哈哈";
               
                while (true)
                {
                        synchronized (str)
                        {
                                if (tickets > 0)
                                {
                                        System.out.printf("%s线程正在卖出第%d张票\n",
                                                Thread.currentThread().getName(), tickets);
                                        --tickets;       
                                }
                                else
                                {
                                        break;
                                }
                        }
                }               
        }
}
public class TestTickets_9
{
        public static void main(String[] args)
        {
                A aa = new A();
                Thread t1 = new Thread(aa);
                t1.start();       
               
                Thread t2 = new Thread(aa);
                t2.start();       
                       
        }
}
在jdk7中运行的结果是:
D:\Java Practice>javac TestTickets_9.ja
D:\Java Practice>java TestTickets_9
Thread-0线程正在卖出第100张票
Thread-0线程正在卖出第99张票
Thread-0线程正在卖出第98张票
Thread-0线程正在卖出第97张票
Thread-0线程正在卖出第96张票
Thread-0线程正在卖出第95张票
Thread-0线程正在卖出第94张票
...
//字数限制,在此省略,以此类推
Thread-0线程正在卖出第2张票
Thread-0线程正在卖出第1张票
补充:我的系统是win7,不管我运行多少次,结果都一样,都只有一个线程在运行,这是为什么,是系统设置的问题吗?还是程序的问题?但是我又在网上下载了了一些多线程的程序,结果也是只有一个线程在运行。该如何解决?我的qq:736060895

回复

使用道具 举报

千问 | 2011-8-8 13:48:31 | 显示全部楼层
LZ,你的电脑和配置都没问题,是程序有bug,这是一个多线程的程序,tickets这个变量是被t1和t2两个线程共享,加上关键字synchronized 没错,主要问题是,线程t1开始运行后就把变量tickets锁定了,而且在t1执行结束以前都没有放开这个变量(一直在执行循环),当tickets=0的时候线程t1才为它(tickets)解锁,此时线程t2才有机会访问变量tickets,但是此时tickets等于0,故线程t2直接跳出循环,解决的办法很简单,可以让线程t1在执行完一个循环后,把变量tickets解锁一段时间,让线程t2有机会访问它,我让线程t1执行完一个循环就停顿2秒,结果就变成楼主想要的了,一下是我修改后的代码:class A im...
回复

使用道具 举报

千问 | 2011-8-8 13:48:31 | 显示全部楼层
朋友,你好,你可以把票数多懂一些,比如说2000张,然后多运行几次,再看看结果,你的处理器好,处理速度快,所以会出现这种情况,我前段时间学线程时也是这种情况,郁闷了我好久,一样的程序和视频中运行出来的结果差别较大,但是多运行几次还是可以看到有线程在交替运行。...
回复

使用道具 举报

千问 | 2011-8-8 13:48:31 | 显示全部楼层
你要搞清楚你的两个线程都是共享的是同一个成员变量tickets 而且你是用的线程同步 当第一个线程运行完了以后 也就是当tickets=0的时候第一个线程结束了
第二个线程就开始运行 但是此时的tickets=0所以第二个线程就进入了else里面
所以就跳出了这个循环结果肯定只会显示第一个线程运行的结果..... ...
回复

使用道具 举报

千问 | 2011-8-8 13:48:31 | 显示全部楼层
你这里有两个问题第一:main方法里改一下:A aa = new A();A aaa = new A();Thread t1 = new Thread(aa);t1.start();Thread t2 = new Thread(aaa);t2.start();你原来定义的t1和t2事实上是一个线程,改成这样就是两个线程...
回复

使用道具 举报

千问 | 2011-8-8 13:48:31 | 显示全部楼层
因为你的程序总是一个线程在跑啊,当然是这样了。你再开几个程序看看都启动他们,看看效果是不是你想要的。一个程序一个线程,启动多个Myeclipse同时运行这个程序。...
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行