初探多线程

作者: 写代码的海怪 | 来源:发表于2020-06-16 10:55 被阅读0次

为什么需要多线程

对于一些密集型的 IO 操作如,网络 IO,文件 IO,我们很想当他们做 IO 操作的时候让 CPU 处理别的事情。这就需要多线程了。

因为 Java 一般是同步/阻塞的,所以多线程可以让我们做 A 的同时,去做 B。例如

// 声明线程
new Thread(Test::xxx).start();
new Thread(Test::xxx).start();
new Thread(Test::xxx).start();

xxx();

上面就是线程的简单用法。

start() vs run()

这两个方法看上去很像,区别就是 start() 是到一边去做干活同时 CPU 干别的,而 run() 是干完活再干下一个。

作用域

  • 局部变量是线程私有的
  • 静态方法/类变量是被线程共享的

变量共享的问题

因为多线程的特点就是无序的,所以当用线程操作同一个东西的时候,有可能出现问题,如下面的例子:统计有多少个线程在工作

public class Test {
    private static int count = 0;

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(Test::xxx).start();
        }
    }

    private static void xxx() {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        count += 1;
        System.out.println("count: " + i);
    }
}

结果就不对了

这里的原因是因为 i += 1 不是原子操作,操作分别如下:

  • 先取 i 的值
  • 把 i 的值 +1
  • 把修改后的值写回 i

而线程又是无序的,所以上面3种状态都可能被不同线程访问到。

场景

  • 对于 IO 密集型很好
    • 网络 IO
    • 文件 IO
  • 不适合 CPU 密集
    • 很有限

网络 IO,把数据一丢,CPU 去处理别的

相关文章

  • 初探多线程

    为什么需要多线程 对于一些密集型的 IO 操作如,网络 IO,文件 IO,我们很想当他们做 IO 操作的时候让 C...

  • python多线程初探

    前几天写了个爬虫,抓了几十万的数据,但是跑了20多个小时,深深感觉单线程的爬虫还是灰常慢,所以觉得还是有必要学学多...

  • 【Java】多线程初探

    Java的线程状态 从操作系统的角度看,线程有5种状态:创建, 就绪, 运行, 阻塞, 终止(结束)。如下图所示 ...

  • JAVA 多线程初探

    1.背景介绍 线程 进程中负责程序执行的执行单元 线程本身依靠程序进行运行 进程 执行中的程序一个进程至少包含一个...

  • Java多线程初探

    本文列举了Java多线程相关的一些重要概念,作为后续系列文章索引。 Linux锁机制对比 spinlock: 自旋...

  • iOS多线程初探

    最近做项目遇到消息处理的问题,涉及到消费与生产的多线程问题。而看到同事知其然不知其所以然的代码,想纠正发现自己的理...

  • ffmpeg-OpenSLES播放音频数据

    前言 ndk调试命令 上两篇文章FFmpeg - 初探ffmepg并解码数据FFmpeg-多线程解码播放下面是基于...

  • Java线程池初探

    Java线程池初探 1. 为什么要用线程池? 多核CPU时代,为更好利用资源以获取更高的性能,多线程编程早已普通应...

  • iOS 多线程初探 (二)

    四、iOS 中的多线程 主要有三种:NSThread、NSoperationQueue、GCD NSThread:...

  • 笔记-多线程底层初探

    线程与进程 线程的定义 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行 进程想要执行任务,必须得有线程...

网友评论

    本文标题:初探多线程

    本文链接:https://www.haomeiwen.com/subject/zjylxktx.html