(一)认识多线程
一、进程
- 要想了解线程,首先得提到“进程”这个概念,
- 进程:进程是操作系统结构的基础;是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的行动;是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单元。
- 更具体的讲:如下图
-
每一个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