跳到主要内容
  1. 所有文章/

Java多线程基础笔记

点击查看笔记列表

一些基本问题 #

  1. Java默认有几个线程?2个线程 main线程、GC线程
  2. JAVA真的可以开启线程吗? 开不了的! Java是没有权限去开启线程、操作硬件的,这是一个native的一个本地方法,它调用的底层的C++代码。
    public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }
    //这是一个C++底层,Java是没有权限操作底层硬件的
    private native void start0();
  1. 并发:多线程操作同一个资源。CPU 只有一核,模拟出来多条线程,天下武功,唯快不破。那么我们就可以使用CPU快速交替,来模拟多线程。
  2. 并行:多个人一起行走。CPU多核,多个线程可以同时执行。 我们可以使用线程池!
  3. Java代码里定义的线程的状态:
    public enum State {
            //新建
            NEW,
            //运行
            RUNNABLE,
            //阻塞
            BLOCKED,
            //等待
            WAITING,
            //超时等待
            TIMED_WAITING,
            //终止
            TERMINATED;
        }
    

线程和进程的区分 #

  • 说起进程。就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
  • 而进程则是执行程序的依次执行过程,它是一个动态的概念。是系统资源分配的单位
  • 通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位。

注意:很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错局。

核心概念 #

  • 线程就是独立的执行路径
  • 在程序运行时,即使没有自己创建线程,后台也会有多个线程,比如主线程,GC线程
  • main()称之为主线程,为系统的入口,用于执行整个程序
  • 在一个进程中,如果开辟了多个线程,线程的运行是由调度器(cpu)安排调度的,调度器是与操作系统紧相关的,先后顺序是不能人为干预的
  • 对同一份资源操作时会存在资源抢夺的问题,需要加入并发控制
  • 线程会带来额外的开销,如CPU调度时间,并发控制开销
  • 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致

笔记列表 #

线程实现的三种方式

·📄 2423 字·🍵 5 分钟
继承Thread类(重要) # 自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用start()方法启动线程 实现 #public class Demo1_CreateThread1 extends Thread { @Override public void......

线程通信--生产者消费者问题

·📄 2757 字·🍵 6 分钟
这是一种典型的线程通信问题。传统synchronized的解决思路,管程法和信号灯法,Lock锁实现生产者消费者问题,Condition的优势。

线程状态

·📄 1812 字·🍵 4 分钟
线程的五种状态:创建状态,就绪状态,阻塞状态,运行状态,死亡状态。有关线程状态变化的一些常用方法,wait和sleep的区别

线程池

·📄 1822 字·🍵 4 分钟
提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁,实现重复利用。类似生活中的公共交通工具。

线程同步

·📄 2251 字·🍵 5 分钟
线程同步是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕,下一个线程再使用。线程同步的形成关键是:队列和锁