黑马程序员--创建线程的两种方式、步骤以及代码体现

java中对线程这类事物进行了描述,即Thread类

方式一.继承Thread类

步骤:1.定义类继承Thread。

   2.复写Thread类中的run()方法。

     3.创建定义类对象调用线程的start()方法;此处start()方法有两个作用:启动线程和调用复写的run()方法。

举例如下:

class RunThread extends Thread//1.定义类继承Thread
{
      private String name;
      RunThread(String name)
      {
             super(name);
      }

      public void run()//2.复写Thread中的run()方法
     {
            for(int x=0;x<30;x++)
           {
                  //打印线程名称有以下两种方法,第二种更常用
                  //System.out.println(this.getName()+" run ..."+x);
                  System.out.println(Thread.currentThread().getName()+" run ..."+x);
            }
      }

}
class  ThreadDemo
{
       public static void main(String[] args)
      {

             //3.创建定义类对象即创建了线程,并调用start()方法
             RunThread rt1=new RunThread("线程1");
             RunThread rt2=new RunThread("线程2");
             rt1.start();
             rt2.start();
             for(int x=0;x<60;x++)
            {
                   System.out.println("主线程 run ..."+x);
            }
       }
}

由于除了在接口之间允许多继承外,java只支持单继承,当定义的类有父类时若还想创建线程第一种方式失效

方式二:实现Runnable接口

步骤:1.定义类实现Runnable接口。

   2.覆盖Runnable接口中的run()方法;注意将线程所要运行的代码放在run()方法中。

     3.通过Thread类建立线程对象。

     4.将Runnable接口的子类对象作为实际参数传给Thread类的构造函数。因为要让线程去执行指定对象的run()方法,就必须明确run()方法

的所属对象。

     5.调用Thread类的start()方法开启线程并调用Runnable接口子类的run()方法。

举例如下:

class Bank
{
      private int sum=0;
      Object obj=new Object();
      public void add(int n)
     {
          synchronized(obj)//此处为同步代码块,为避免多线程带来的安全问题而加
         {
               sum=sum+n;
              System.out.println("sum= "+sum);
          }
 
      }

class Consumer implements Runnable //1.定义类实现Runnable接口
{
        private Bank b=new Bank();
        public void run()//2.覆盖Runnable接口中的run()方法
       {
              for(int x=0;x<3;x++)
             {
                   b.add(100);
             }
        }
}
class TongbuDemo
{
      public static void main(String[] args)
      {

          //3.通过Thread类建立线程对象;4.将Runnable接口的子类对象作为实际参数传给Thread类的构造函数  
               Consumer c=new Consumer();

              Thread t1=new Thread(c);
              Thread t2=new Thread(c);

          //5.调用Thread类的start()方法
               t1.start();
               t2.start();
       }
}

两种方式都可以创建线程,考虑到单继承的局限性,建议在定义线程时使用实现方式

posted @ 2012-03-16 17:55  黑马--刘元明  阅读(973)  评论(0)    收藏  举报