线程不是时髦的技术,但是是基本的技术,对于的长远发展,必须要做好这些基本功。

线程就是程序的一条执行线索,运用多线程,可以在程序中有多条执行路线,比如说可以有两个while循环,而没有多线程,这是无法实现的,必须的等到一个while循环结束,才能执行下一个while循环。 

线程的创建有两种方式:

  • 方法一:(new thread的子类)两件事:创建;启动

    1. Thread thread=new Thread(){}//创建线程的子类,重写run()方法 
    2. thread.start();//启动线程 

Run()内部代码如下:

 

  1. public void run() { 
  2.        if (target != null) { 
  3.            target.run(); 
  4.        } 
  5.  } 

代码中的target是这样定义的: private Runnable target;target是一个Runnable对象 ,所以可以把Runnable对象传递给线程ThreadThread运行的时候就会去找Runnablerun()方法,代码就会运行,在源代码中target是通过init()赋值的。通过上述代码可以理解线程创建的第二个方法:

  • 方法二:new Thread(),run()方法放在new Runnable()里面,体现面向对象思想

    1. Thread thread2=new Thread(new Runnable(){}//在Runnable()放run()方法 
    2. thread2.start(); 

创建线程的两种方法的代码如下:

 

  1. public class TraditionalThread { 
  2.     //创建线程的方法一 
  3.     public static void main(String[] args) { 
  4.         Thread thread=new Thread(){//new一个Thread的子类,改掉它的内部类的方法 
  5.             @Override 
  6.             public void run() { 
  7.                 while(true){//希望代码长时间的运行 
  8.                     try { 
  9.                         Thread.sleep(500); 
  10.                     } catch (InterruptedException e) { 
  11.                         e.printStackTrace(); 
  12.                     } 
  13.                     //当前线程对象的名字 
  14.                     System.out.println("1:"+Thread.currentThread().getName()); 
  15.                     //this代表该run方法所在的对象Thread,this相当于Thread.currentThread() 
  16.                     System.out.println("2:"+this.getName());//尽管this可以使用,但应该避免,容易混淆 
  17.                 } 
  18.             } 
  19.         }; 
  20.         thread.start(); 
  21.          
  22.         //线程创建方法二 
  23.         Thread thread2=new Thread(new Runnable(){//Runnable()里边放运行的代码 
  24.             @Override               //new Runnable()更能体现面向对象的方式 
  25.             public void run() { 
  26.                 while(true){ 
  27.                     try { 
  28.                         Thread.sleep(500); 
  29.                     } catch (InterruptedException e) { 
  30.                         // TODO Auto-generated catch block 
  31.                         e.printStackTrace(); 
  32.                     } 
  33.                     System.out.println("1:"+Thread.currentThread().getName());//当前线程对象 
  34.                     //这时候不能使用this,因为this在这个时候代表 Runnable(),而它不是线程, 
  35.                     //是线程要运行代码的宿主 
  36.                 } 
  37.             } 
  38.         }); 
  39.         thread2.start(); 
  40.   } 

运行的结果:

创建线程的两种方式_java多线程

为加深对两种方法创建线程的理解,判断以下的代码执行那一个run()方法:

 

  1. public class TraditionalThread { 
  2.     //创建线程的方法一 
  3.     public static void main(String[] args) { 
  4.         Thread thread=new Thread(){//new一个Thread的子类,改掉它的内部类的方法 
  5.             @Override 
  6.             public void run() { 
  7.                 while(true){//希望代码长时间的运行 
  8.                     try { 
  9.                         Thread.sleep(500); 
  10.                     } catch (InterruptedException e) { 
  11.                         e.printStackTrace(); 
  12.                     } 
  13.                     //当前线程对象的名字 
  14.                     System.out.println("1:"+Thread.currentThread().getName()); 
  15.                     //this代表该run方法所在的对象Thread,this相当于Thread.currentThread() 
  16.                     System.out.println("2:"+this.getName());//尽管this可以使用,但应该避免,容易混淆 
  17.                 } 
  18.             } 
  19.         }; 
  20.         thread.start(); 
  21.          
  22.         //线程创建方法二:new Runnable()更能体现面向对象的方式,最好用这种方式 
  23.         Thread thread2=new Thread(new Runnable(){//Runnable()里边放运行的代码 
  24.             @Override                
  25.             public void run() { 
  26.                 while(true){ 
  27.                     try { 
  28.                         Thread.sleep(500); 
  29.                     } catch (InterruptedException e) { 
  30.                         // TODO Auto-generated catch block 
  31.                         e.printStackTrace(); 
  32.                     } 
  33.                     System.out.println("1:"+Thread.currentThread().getName());//当前线程对象 
  34.                     //这时候不能使用this,因为this在这个时候代表 Runnable(),而它不是线程, 
  35.                     //是线程要运行代码的宿主 
  36.                 } 
  37.             } 
  38.         }); 
  39.         thread2.start(); 
  40.      
  41.         //判断以下代码执行哪一个run()方法 
  42.         //代码结构new Thread(runnable.run){run}.start(),判断是运行runnable.run方法还是{run}方法 
  43.                 new Thread( 
  44.                         new Runnable(){ 
  45.                             public void run() { 
  46.                                 while(true){ 
  47.                                     try { 
  48.                                         Thread.sleep(500); 
  49.                                     } catch (InterruptedException e) { 
  50.                                         e.printStackTrace(); 
  51.                                     } 
  52.                                     System.out.println("runnable :" + Thread.currentThread().getName()); 
  53.                                 }                            
  54.                             } 
  55.                         } 
  56.                 ){//new Thread(){}.start() 
  57.                     public void run() { 
  58.                         while(true){ 
  59.                             try { 
  60.                                 Thread.sleep(500); 
  61.                             } catch (InterruptedException e) { 
  62.                                 e.printStackTrace(); 
  63.                             } 
  64.                             System.out.println("thread :" + Thread.currentThread().getName()); 
  65.                         }    
  66.                     } 
  67.                 }.start(); 
  68.     } 

分析:用面向对象的思想思考:Thread启动以后,会用当前对象的run方法,即去运行这个{run}里面的run()方法,当该方法不存在时才会去运行runnable.run,即runnable里边的run()方法,run方法把runnable.run方法盖掉了

运行结果部分(死循环)截图:

创建线程的两种方式_java多线程_02

下面是关于线程一点常识性的知识:

1多线程不会提高程序的运行效率,一般来说反而会使程序更慢,cpu只有一个(现在2核的除外,性能更低,线程之间的切换也会浪费一定的时间,

2拷贝文件,一次性拷贝更快,而不是一个一个拷贝更快

3多线程下载提高下载速度,其实并不是自己的计算机速度快了,是抢了服务器的带宽,是这样加速,利用多线程相当于是去抢了别人的资源,让服务器为自己提供更多的服务。