多线程学习
多线程学习
基础知识
1、程序、进程、线程
程序:为了完成某个任务,使用某种特定的语言(Java)所编写的指令(代码)的集合。程序是静态的。
进程:一个正在运行的程序就可以叫做进程。
例如:运行中的QQ就是一个进程。
进程是动态的,程序是静态的。
进程是资源分配的最小单位,系统在运行时会为每个进程分配不同的内存区域。
线程:进程中的一个执行路径。一个进程至少有一个线程。如果一个程序同一时间并行执行多个线程,说明该程序是支持多线程的。
线程是CPU调度的最小单位。线程在进程中有独立的程序计数器(pc)和运行栈。
2、并行和并发
并行:多个CPU执行不同的任务。如:多个人同时做不同的事。
并发:同一个cpu执行多个任务。如:一个人在一个时间段里做多个事。
线程的创建和使用
创建方式有两种:继承Thread类、实现Runnable接口。
(1)继承Thread类
实现步骤:
1. 继承Thread类
2. 重写run()方法
3. 创建子类的实例
4. 调用start()方法执行
代码演示:
public class ThreadTest {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
在run方法中可以写该线程需要干的事。
只有调用start()方法才能够启动线程,并且线程只能启动一次,想要再次启动线程需要重新创建一个子类对象。
在这里有个面试的问题,就是调用run()方法和start()方法的区别?
答:调用run()方法不会启动线程,相当于只有main方法这个主线程,而调用start()方法才会启动线程。
(2)实现Runnable接口
实现步骤:
1. 实现Runnable接口
2. 实现接口的run()方法
3. 创建实现类的对象
4. 把这个对象当做参数传入Thread类的构造器中,创建Thread的实例。
5. 通过Thread实例调用start()方法
代码演示:
public class ThreadTest2 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
}
}
class MyThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
两种方式对比:
使用实现Runnable接口的方式比较好,因为Java中是单继承,如果继承了Thread类,就会有局限性。使用接口就能取消这种局限性。使用接口更适合来处理多个线程有共享数据的情况。