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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张振纲 中级黑马   /  2012-8-2 00:13  /  2193 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Ticket implements Runnable
  2. {
  3.         private int num = 1000;
  4.         public void run()
  5.         {
  6.                 while (num >0)
  7.                         {
  8.                                 System.out.println(Thread.this.getName()+"....."+num);
  9.                                 num--;
  10.                         }
  11.         }
  12. }
  13. class SaleTicket
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 Ticket t = new Ticket();
  18.                 Thread t1 = new Thread(t);
  19.                 Thread t2 = new Thread(t);
  20.                 //Thread t3 = new Thread(t);
  21.                 //Thread t4 = new Thread(t);
  22.                 //Thread t5 = new Thread(t);

  23.                 t1.start();
  24.                 t2.start();
  25.                 //t3.start();
  26.                 //t4.start();
  27.                 //t5.start();

  28.         }
  29. }
复制代码
错误提示,第八行Theard不是封闭类@@

5 个回复

倒序浏览
class Ticket implements Runnable
{
        private int num = 1000;
        public void run()
        {
                while (num >0)
                        {
                                System.out.println(Thread.this.getName()+"....."+num);楼主这里出错了,下面详细说明
                                num--;
                        }
        }
}
class SaleTicket
{
        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);
                //Thread t5 = new Thread(t);
                t1.start();
                t2.start();
                //t3.start();
                //t4.start();
                //t5.start();
        }
}

红色部分的代码应该改成Thread.currentThread.getName(),这个是调用Thread类里面定义好的方法,来返回当前执行的线程对象的引用
你这里用一个this.意思是引用本类对象,虽然你Ticket类实现了Runnable接口,但是这里面是没有这个方法的
Thread类是实现Runnable接口的类
像这些调用,java里面都是定义好的,除非你自己重新写一个方法,重新定义,否则就必须按照java里面定义好的方法去调用

回复 使用道具 举报
Thread.currentThread().getName()
  1. class Ticket implements Runnable
  2. {
  3.         private int num = 1000;
  4.         public void run()
  5.         {
  6.                 while (num >0)
  7.                         {
  8.                                 System.out.println(Thread.currentThread().getName()+"....."+num);
  9.                                 num--;
  10.                         }
  11.         }
  12. }
  13. class SaleTicket
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 Ticket t = new Ticket();
  18.                 Thread t1 = new Thread(t);
  19.                 Thread t2 = new Thread(t);
  20.                 //Thread t3 = new Thread(t);
  21.                 //Thread t4 = new Thread(t);
  22.                 //Thread t5 = new Thread(t);

  23.                 t1.start();
  24.                 t2.start();
  25.                 //t3.start();
  26.                 //t4.start();
  27.                 //t5.start();

  28.         }
  29. }
复制代码
回复 使用道具 举报
本帖最后由 李志广 于 2012-8-2 00:35 编辑

  • class Ticket implements Runnable
  • {
  •         private int num = 1000;
  •         public void run()
  •         {
  •                 while (num >0)
  •                         {
  •                                 System.out.println(Thread.currentThread().getName()+"....."+num);
  •                                 num--;
  •                         }
  •         }
  • }
  • class SaleTicket
  • {
  •         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);
  •                 //Thread t5 = new Thread(t);
  •                 t1.start();
  •                 t2.start();
  •                 //t3.start();
  •                 //t4.start();
  •                 //t5.start();
  •         }
  • }
  •     使用继承Thread时获得当前线程比较简单:直接使用this就可以了!但是用实现Runnable接口时要获得当前线程必须用Thread.currentThread().getName()方法。而你之所以出现错误就是因为实现Runnable接口是用this,所以肯定不行啦!
  • 希望对你有所帮助!!!!{:soso_e100:}

回复 使用道具 举报

内部类问题

  
class Ticket implements Runnable
{
         private int num = 1000;
         public void run()
         {
                 while (num >0)
                         {
                                 System.out.println(Thread.this.getName()+"....."+num);//应该改成Thread.currentThread.getName()
                                 num--;
                         }
         }
}
class SaleTicket
{
         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);
                 //Thread t5 = new Thread(t);
                 t1.start();
                 t2.start();
                 //t3.start();
                 //t4.start();
                 //t5.start();
         }
}

//Thread.this.getName() 应该改成Thread.currentThread.getName()就好了,this是调用本类对象,
//但是本类中 自定了getName方法是可以的,所以如果不是父类中定义好的方法都学要自己定义,下面还有以下总结也顺便
//分享下把

/*用Thread类创建线程
  1 要将一段代码在一个新的线程上运行,该代码应该在一个类的run函数中,并且run函数所在的类是
Thread类的子类。倒过来看:我们要实现多线程,必须编写一个继承了Thread类的子类,子类覆盖了
Thread的run()函数,在子类的函数中调用想在新线程上运行的程序代码。

2 启动一个新的线程我们不是直接调用Thread的子类的run()方法,而是调用Thread子类对象的start方
法,start()方法将产生一个新的线程,并在该线程上运行该Thread类对象中的run()方法,根据面向对象
的运行时的多态性,在该线程上实际运行的是Thread子类对象的run()方法。

3由于线程的代码段在run方法中,那么该方法执行完成以后线程也就相应的结束了,因而我们可以通过
控制run方法中的循环条件来控制线程的结束。

使用Runnable 接口创建多线程

1 适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程) 同程序的代码,数据有效分
离,较好的体现了面向对象的设计思想。

2 可以避免由于java的单继承特性带来的局限。我们将已经继承了一个类的子类放入多线程,由于不能
有两个父类,就不能继承Thread,那么这个类就只能实现Runnable接口。

3 当线程被构造时,需要的代码和数据通过一个对象作为 构造函数的实参传递进去,这个对象就是实现
了Runnable接口的类的实例。

4 事实上,几乎所有的多线程应用都可用Runnable接口方式。
*/
回复 使用道具 举报
我觉得不管什么情况,想获得当前线程,直接写Thread.currentThread.getName(),就比较保险了,呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马