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

© fmi110 高级黑马   /  2015-9-25 15:01  /  341 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

a
  1. 1、多线程:
  2.         概念:
  3.                 1 进程:正在运行的程序
  4.                 2 线程:进程中一个程序执行的控制单元(执行路径)。
  5.        
  6.         P.S.
  7.         1、一个进程中可以有多个执行路径,称之为多线程。
  8.         2、一个进程中至少要有一个线程。
  9.         3、开启多个线程是为了同时运行多部分代码,每一个线程都有自己运行的内容,这个内容可以称为线程要执
  10.         行的任务。

  11.         多线程的好处:解决多部分代码同时运行的问题。
  12.                         弊端:线程太多,会导致效率的降低。
  13.                                 因为,多个程序同时运行,cpu需要在各个线程间进行不停的切换,这也需要消耗资源

  14.         PS:JVM启动时,至少启动了两条线程:
  15.                 1 执行main函数的线程
  16.                 2 垃圾回收线程
  17.          ————————————————————————————————————————————————————————————————————
  18.                         class Test14 {
  19.                         public static void main(String[] args) {
  20.                                         A a = new A();
  21.                                         a = null;
  22.                                         System.gc();// garbage collection
  23.                                         System.out.println(Thread.currentThread().getName() + " over");
  24.                                 }
  25.                         }

  26.                         class A {
  27.                                 @Override
  28.                                 protected void finalize() throws Throwable {
  29.                                         System.out.println("A 的 finalize()被调用,调用进程是:"
  30.                                                         + Thread.currentThread().getName());
  31.                                 }
  32.                         }
  33.                         输出结果:
  34.                         main over
  35.                         A 的 finalize()被调用,调用进程是:Finalizer
  36.          ————————————————————————————————————————————————————————————————————
  37. 2、创建线程的方式:
  38.         方法1 继承Thread类:
  39.                 1 定义类继承Thread类
  40.                 2 重写run方法
  41.                 3 直接创建Thread类的子类,并调用start()方法启动线程
  42.         方法2 定义类实现Runnable接口
  43.                 1 定义类实现Runnable接口
  44.                 2 重写run方法
  45.                 3 创建实现Runnable接口的对象
  46.                 4 将对象作为参数传递给一个Thread类的对象,并调用该对象的start()方法启动线程

  47.                 实现Runnable接口的好处:
  48.                         1. 将线程的任务从线程的子类中分离出来,进行了单独的封装,更符合面向对象的思想。
  49.                         2. 避免了Java单继承的局限性。 所以,创建线程的第二种方式较为常用。
  50.         ————————————————————————————————————————————————————————————————————
  51.                                 public class CreatThreadDemo {
  52.                                         public static void main(String[] args) {
  53.                                                 new MyThread().start();
  54.                                                 new Thread(new RunnableImpl()).start();
  55.                                         }
  56.                                 }

  57.                                 class MyThread extends Thread {
  58.                                         public void run() {
  59.                                                 while (true) {
  60.                                                         try {
  61.                                                                 Thread.sleep(200);// 父类没有抛出异常,子类调用有抛异常的方法时,只能进行catch处理
  62.                                                         } catch (InterruptedException e) {
  63.                                                                 // TODO Auto-generated catch block
  64.                                                                 e.printStackTrace();
  65.                                                         }
  66.                                                         System.out.println("我是继承Thread创建的进程:"
  67.                                                                         + Thread.currentThread().getName());
  68.                                                 }
  69.                                         }
  70.                                 }

  71.                                 class RunnableImpl implements Runnable {
  72.                                         public void run() {
  73.                                                 while (true) {
  74.                                                         try {
  75.                                                                 Thread.sleep(200);
  76.                                                         } catch (InterruptedException e) {
  77.                                                                 // TODO Auto-generated catch block
  78.                                                                 e.printStackTrace();
  79.                                                         }
  80.                                                         System.out.println("我是实现了Runnable创建的进程:"
  81.                                                                         + Thread.currentThread().getName());
  82.                                                 }
  83.                                         }
  84.                                 }
  85.                                 运行结果:
  86.                                 我是实现了Runnable创建的进程:Thread-1
  87.                                 我是继承Thread创建的进程:Thread-0
  88.                                 我是继承Thread创建的进程:Thread-0
  89.                                 我是实现了Runnable创建的进程:Thread-1
  90.                                 我是继承Thread创建的进程:Thread-0
  91.                                 我是实现了Runnable创建的进程:Thread-1
  92.                                 我是实现了Runnable创建的进程:Thread-1
  93.         ————————————————————————————————————————————————————————————————————
  94.         PS:JVM创建的主线程的主任务定义在了主函数中,而自定义的线程其任务定义在run方法中,也就说
  95.         run方法是封装了自定义线程运行任务的函数
复制代码


1 个回复

倒序浏览
您需要登录后才可以回帖 登录 | 加入黑马