目录

Java多线程原理

什么是多线程

  • 一个程序同时执行多个任务,每一个任务称为一个线程(Thread),它是线程控制的简称。
  • 可以同时运行一个以上线程的程序称为多线程程序(multithreaded)。

为什么会有多线程

  • CUP运行速度太快了,完成一个任务到执行下一个任务需要等待很长时间。
  • 现代CUP多个核心,可并发执行多个任务。(CPU多核心是为了解决性能越高,发热量越大的瓶颈)
  • Java的执行模型是同步的、阻塞的
  • 默认情况下只有一个线程。处理问题自然,但有严重的性能问题。

Thread类

使用new操作符创建新的线程。new Thread(r),该线程还没有开始运行,处于新创建状态。要使其运行调用 start()方法。

new Thread(()->{
    System.out.println("这是一个新线程");
}).start();

thread是Java中唯一代表线程的东西。每多开一个线程,就多一个执行流。执行流中的方法栈(局部变量)是线程私有的。 静态变量、类变量是被所有线程共享的。

多线程带来了的麻烦

多线程提升了程序的性能,提升了使用体验。同时也带来了麻烦,使用它是有难度的。

因为多线程是以乱序执行的。一个可运行的线程可能正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。线程不会始终保持运行, 会被操作系统终端,让其他线程获得运行机会。 抢占式调度系统给每一个可运行线程一个时间片来执行任务。当时间片用完,操作系统剥夺该线程的运行权,并给另一个线程运行机会。

其实际问题是,多个线程同时操作,共享的数据。

public class testThread
{
    private static int i = 0;

    public static void main(String[] args) {
        for (int j = 0; j < 10; j++) {
            new Thread(testThread::add).start();
        }
    }

    private static void add() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        i++;
        System.out.println(i);
    }
}
/**
1
1
1
2
4
3
7
6
5
8
*/

多线程的使用场景

  • IO密集型应用
    • 网络IO
    • 文件IO