黑马程序员——多线程1

来源:互联网 发布:全知之眼纹身意义 编辑:程序博客网 时间:2024/05/20 04:46
------- android培训java培训、期待与您交流! ----------

一、进程、线程概念:

进程:正在进行中的程序(直译)。
 线程:进程中一个负责程序执行的控制单元(执行路径)。
注意:
 1、一个进程中可以有多个执行路径,称之为多线程。
 2、一个进程中至少要有一个线程。
 3、开启多个线程是为了同时运行多部分代码,每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务。


多线程的好处:解决了多部分代码同时运行的问题。
 多线程的弊端:线程太多,会导致效率的降低。
 其实,多个应用程序同时执行都是CPU在做着快速的切换完成的。这个切换是随机的。CPU的切换是需要花费时间的,从而导致了效率的降低。
 JVM启动时启动了多条线程,至少有两个线程可以分析的出来:
 1.执行main函数的线程,该线程的任务代码都定义在main函数中。
 2.负责垃圾回收的线程。

示例:

[java] view plaincopy
  1. class ThreadDemo {  
  2.      public static void main(String[] args){  
  3.          new Demo();  
  4.          new Demo();  
  5.          System.gc();  
  6.          new Demo();  
  7.          System.out.println("Hello World!");  
  8.          }  
  9. }  
  10. public class Demo {  
  11.     public void finalize(){  
  12.          System.out.println("demo ok");  
  13.          }  
  14. }  
程序运行结果如图:。像这种情况,之所以先打印demo ok再打印Hello World后再打印demo ok,是因为两条线程是分开执行的。

注意:

System类的gc方法告诉垃圾回收器调用finalize方法,但不一定立即执行。


二、创建线程方式一:继承Thread类

1.定义一个类继承Thread类。
 2.覆盖Thread类中的run方法。
3.直接创建Thread的子类对象创建线程。
 4.调用start方法开启线程并调用线程的任务run方法执行。

示例:

[java] view plaincopy
  1. public class Demo {  
  2.      private String name ;  
  3.      Demo(String name){  
  4.      this.name = name;  
  5.      }  
  6.      public void show(){  
  7.      for(int x = 0; x < 10; x++){  
  8.      System.out.println(name + "...x=" + x);  
  9.         }  
  10.      }  
  11. }  
  12. class ThreadDemo {  
  13.     public static void main(String[] args){  
  14.          Demo d1 = new Demo("鱼跃此时海");  
  15.          Demo d2 = new Demo("花开彼岸天");  
  16.          d1.show();  
  17.          d2.show();  
  18.          }  
  19. }  
最后程序的运行结果如下:

 可以看到在单线程程序中,只有上一句代码执行完,下一句代码才有执行的机会。
创建线程的目的就是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行,而运行的指定代码就是这个执行路径的任务。


jvm创建的主线程的任务都定义在了主函数中。而自定义的线程,它的任务在哪儿呢?
 Thread类用于描述线程,线程是需要任务的。所以Thread类也有对任务的描述。这个任务就是通过Thread类中的run方法来体现。也就是说,run方法就是封装自定义线程运行任务的函数,run方法中定义的就是线程要运行的任务代码。


开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法,将运行的代码定义在run方法中即
可。

多线程程序示例:

[java] view plaincopy
  1. public class Demo extends Thread{  
  2.         private String name ;  
  3.         Demo(String name){  
  4.             this.name = name;  
  5.         }  
  6.         public void run(){  
  7.             for(int x = 0; x < 10; x++){  
  8.                 System.out.println(name + "...x=" + x + "...ThreadName=" +  
  9.                         Thread.currentThread ().getName());  
  10.             }  
  11.         }  
  12. }  
  13. class ThreadDemo {  
  14.     public static void main(String[] args){  
  15.         Demo d1 = new Demo(" 旺财 ");  
  16.         Demo d2 = new Demo("xiaoqiang");  
  17.         d1.start(); // 开启线程,调用 run 方法。  
  18.         d2.start();  
  19.         for(int x = 0; x < 20; x++){  
  20.             System.out.println("x = " + x + "...over..." +  
  21.                     Thread.currentThread().getName());  
  22.         }  
  23.     }  
  24. }  
程序运行结果为:

注意:
1、可以通过Thread的getName方法获取线程的名称,名称格式:Thread-编号(从0开始)。
2、Thread在创建的时候,该Thread就已经命名了。源码如下:

0 0
原创粉丝点击