黑马程序员技术交流社区

标题: 再次求助,多线程又挂了 [打印本页]

作者: 张振纲    时间: 2012-8-2 00:13
标题: 再次求助,多线程又挂了
  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不是封闭类@@
作者: 马州州    时间: 2012-8-2 00:26
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里面定义好的方法去调用


作者: 赵俊杰    时间: 2012-8-2 00:26
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:31
本帖最后由 李志广 于 2012-8-2 00:35 编辑



作者: 尹善波    时间: 2012-8-2 01:04
标题: 内部类问题
  
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接口方式。
*/

作者: 叶征东    时间: 2012-8-2 01:26
我觉得不管什么情况,想获得当前线程,直接写Thread.currentThread.getName(),就比较保险了,呵




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2