黑马程序员--第五篇 多线程

                                             第五篇 多线程 

 

1:要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在。

 

2:什么是进程?

      通过任务管理器我们就看到了进程的存在。

      而通过观察,我们发现只有运行的程序才会出现进程。

      进程:就是正在运行的程序。

      进程是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。

     

3:多进程有什么意义呢?

      单进程的计算机只能做一件事情,而我们现在的计算机都可以做多件事情。

      举例:一边玩游戏(游戏进程),一边听音乐(音乐进程)。

      也就是说现在的计算机都是支持多进程的,可以在一个时间段内执行多个任务。

      并且呢,可以提高CPU的使用率。

     

      问题:

           一边玩游戏,一边听音乐是同时进行的吗?

           不是。因为单CPU在某一个时间点上只能做一件事情。

           而我们在玩游戏,或者听音乐的时候,是CPU在做着程序间的高效切换让我们觉得是同时进行的。

          

4:什么是线程呢?

      在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出是一个线程。

      线程:是程序的执行单元,执行路径。是程序使用CPU的最基本单位。

      单线程:如果程序只有一条执行路径。

      多线程:如果程序有多条执行路径。

     

5:多线程有什么意义呢?

      多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率。

      程序的执行其实都是在抢CPU的资源,CPU的执行权。

      多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权。

      我们是不敢保证哪一个线程能够在哪个时刻抢到,所以线程的执行有随机性。那么怎样实现多线程程序呢?

 

 

/*

 * 需求:我们要实现多线程的程序。

 * 如何实现呢?

 *            由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。

 *            而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。

 *            Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。

 *            但是呢?Java可以去调用C/C++写好的程序来实现多线程程序。

 *            由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西,

 *            然后提供一些类供我们使用。我们就可以实现多线程程序了。

 * 那么Java提供的类是什么呢?

 *            Thread

 *            通过查看API,我们知道了有2中方式实现多线程程序。

 *

 * 方式1:继承Thread类。

 * 步骤

 *            A:自定义类MyThread继承Thread类。

 *            B:MyThread类里面重写run()?

 *            C:创建对象

 *            D:启动线程

 */

public class MyThreadDemo {

      public static void main(String[] args) {

           // 创建线程对象

           // MyThread my = new MyThread();

           // // 启动线程

           // my.run();

           // my.run();

           // 调用run()方法为什么是单线程的呢?

           // 因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果

           // 要想看到多线程的效果,就必须说说另一个方法:start()

           // 面试题:run()和start()的区别?

           // run():仅仅是封装被线程执行的代码,直接调用是普通方法

           // start():首先启动了线程,然后再由jvm去调用该线程的run()方法。

           // MyThread my = new MyThread();

           // my.start();

           // // IllegalThreadStateException:非法的线程状态异常

           // // 为什么呢?因为这个相当于是my线程被调用了两次。而不是两个线程启动。

           // my.start();

 

           // 创建两个线程对象

           MyThread my1 = new MyThread();

           MyThread my2 = new MyThread();

 

           my1.start();

           my2.start();

      }

}

 

 

 

/*

 * 方式2:实现Runnable接口

 * 步骤:

 *      A:自定义类MyRunnable实现Runnable接口

 *      B:重写run()方法

 *      C:创建MyRunnable类的对象

 *      D:创建Thread类的对象,并把C步骤的对象作为构造参数传递

 */

class MyRunnable implements Runnable {

 

   @Override

   public void run() {

      for (int x = 0; x < 100; x++) {

        // 由于实现接口的方式就不能直接使用Thread类的方法了,但是可以间接的使用

        System.out.println(Thread.currentThread().getName() + ":" + x);

      }

   }

public class MyRunnableDemo {

   public static void main(String[] args) {

      // 创建MyRunnable类的对象

      MyRunnable my = new MyRunnable();

 

     

 

      // Thread(Runnable target, String name)

      Thread t1 = new Thread(my, "商鞅");

      Thread t2 = new Thread(my, "赢渠梁");

Thread t3 = new Thread(my, "景监");

 

 

      t1.start();

      t2.start();

t3.start();

 

    }

}

posted on 2015-11-16 20:20  大势  阅读(28)  评论(0)    收藏  举报