A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 136616244 中级黑马   /  2014-5-6 10:25  /  854 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 136616244 于 2014-5-8 21:38 编辑
  1. package 多线程;

  2. class TicketDemo {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 SaleTicket t1 = SaleTicket.getIntance();
  6.                 SaleTicket t2 = SaleTicket.getIntance();
  7.                 SaleTicket t3 =SaleTicket.getIntance();
  8.                 SaleTicket t4 = SaleTicket.getIntance();
  9.                 t1.start();
  10.                 t2.start();
  11.                 t3.start();
  12.                 t4.start();
  13. //                t1.start();
  14.         }
  15.         

  16. }
  17. class SaleTicket extends Thread{
  18.         private int Ticket = 100;
  19.         private SaleTicket(){}
  20.         static  SaleTicket t = new SaleTicket();
  21.         public static SaleTicket getIntance(){
  22.                 return t;
  23.         }
  24.         
  25.         public synchronized void run(){
  26.                 while(Ticket>0){
  27.                         System.out.println(Thread.currentThread().getName()+"..."+Ticket--);
  28.                 }
  29.         }
  30. }
复制代码

5 个回复

倒序浏览
我已经找到问题了,多次开启同一个线程会抛出异常,解决办法?
回复 使用道具 举报
这是必然的,你开了又开Jvm不干了。
回复 使用道具 举报
  • class SaleTicket extends Thread{
  •         private int Ticket = 100;
  •         private SaleTicket(){}
  •         static  SaleTicket t = new SaleTicket();
  •         public static SaleTicket getIntance(){
  •                 return t;
  •         }
  •         public synchronized void run(){
  •                 while(Ticket>0){
  •                         System.out.println(Thread.currentThread().getName()+"..."+Ticket--);
  •                 }
  •         }
  • }

回复 使用道具 举报

class SaleTicket extends Thread{
    private int Ticket = 100;
       private SaleTicket(){}
        static  SaleTicket t = new SaleTicket();
        public static SaleTicket getIntance(){
               return t;
       }

        public synchronized void run(){
                while(Ticket>0){
                       System.out.println(Thread.currentThread().getName()+"..."+Ticket--);
               }
       }
}SaleTicket继承了Thread后,你在内部初始化了一个静态的SaleTicket类的事例化对象,静态实例对象在内存中只存在一份,但你在主函数中用了4个SaleTicket类的应用指向了同一个静态对象,当你调用start()方法后(一个线程被start()4次),JVM会抛出异常!你可以让SaleTicket实现Runnable借口,在主函数中创建一个SaleTicket对象,同时new 4个Thread类的Thread(Runnable target) 构造方法,并将SaleTicket的对象传进Thread(Runnable target) 中就好了!
代码如下:
class ticket implements Runnable//extends Thread
{
        private int tick=100;
        public void run()
        {
                while(true)
                {
                        if(tick>0)
                        System.out.println(Thread.currentThread().getName()+"-------"+tick--);
                        //tick--;
                        //System.out.println("-------"+tick--);
                }
        }
}

class  ThreadTicket
{
        public static void main(String[] args)
        {
                ticket t=new ticket();

                Thread t1=new Thread(t);
                Thread t2=new Thread(t);
                Thread t3=new Thread(t);
                Thread t4=new Thread(t);
               
                //t1.run();
                //t2.run();
                //t3.run();
                //t4.run();
                t1.start();
                t2.start();
                t3.start();
                t4.start();
                //System.out.println("Hello World!");
        }
}


回复 使用道具 举报
一个Thread 线程只能开启一次,否则会报异常。你开启了四次。解决办法,1 只开启一条线程,2实现Runnable
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马