首页 > 代码库 > (一)认识多线程

(一)认识多线程

一、进程

  • 要想了解线程,首先得提到“进程”这个概念,
  • 进程:进程是操作系统结构的基础;是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的行动;是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单元。
  • 更具体的讲:如下图
  • 技术分享

    每一个exe程序都是一个进程。

 

二、线程

  • 线程可以理解成是在进程中独立运行的子任务,比如QQ.exe 运行时就有很多的子任务在同时运行,比如说好友视频线程、传输数据线程、发送表情线程等线程,这些不同的

子任务或者说线程都可以同时运行,这样一来就可以最大限度地利用CPU的空闲时间来处理其他的任务,比如一边让操作系统处理正在由打印机打印的数据,一边使用Word编辑文档。而CPU在这些任务(线程)之间不停切换,由于切换速度快,给使用者产生了这些线程似乎同时运行的错觉,但实际上并不是。

 

三、初步使用多线程

  • 案例一:
package bean;

public class Test {
public static void main(String[] args) {
    System.out.println(Thread.currentThread().getName());
}
}

结果:

技术分享

  • 控制台输出的“main”其实就是一个名称叫main的线程在执行main()方法中的代码。

 

 四、继承Thread类

  • 实现多线程编程的方式主要有两种: 

     1. 继承Thread 类

     2. 实现Runnable 接口   

  •  Thread类也实现了 Runnable 接口 。

 

  • 案例一(线程调用的随机性测试(1)):
package bean;

public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("运行结束");

    }
}

class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        System.out.println("MyThread");
    }

}

结果:

技术分享

  • 在使用多线程的时候,代码的运行结果与代码执行顺序或调用顺序是无关的。   线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法,
  • 所以才会有先打印出“运行结束”再打印“myThread”这样的结果。
  •  注意:  如果多次调用start()方法,会出现异常如下:
Exception in thread "main" MyThread
java.lang.IllegalThreadStateException

 

  •  案例二(线程调用的随机性测试(2)):

 

package bean;

public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();

        try {
            for (int i = 0; i < 10; i++) {
                int time = (int) Math.random() * 1000;
                Thread.sleep(time);
                System.out.println("main==" + Thread.currentThread().getName());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

class MyThread extends Thread {

    @Override
    public void run() {

        try {
            for (int i = 0; i < 10; i++) {

                int time = (int) Math.random() * 1000;
                Thread.sleep(time);
                System.out.println("run==" + Thread.currentThread().getName());

            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

结果:

技术分享

  • start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法,这个过程就是让系统安排时间来调用run()方法,具有异步的效果,

如果在 myThread.start(); 不是调用start()方式而是执行调用myThread.run()方法,那么此线程对象并不交给“线程规划器”来进行处理,而是由main主线程来调用run()

方法,也就是必须等run()方法执行完毕之后才会执行run()方法以后的代码。

 

 

P7

 

(一)认识多线程