多线程学习

多线程学习

基础知识

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类,就会有局限性。使用接口就能取消这种局限性。使用接口更适合来处理多个线程有共享数据的情况。

原文地址:https://www.cnblogs.com/Z-Dey/p/12889180.html