JavaSE:多线程

多线程

学习遇见狂神说java多线程笔记,截图来自课程ppt

1.process进程与thread线程

进程是执行程序的一次执行的过程,它是一个动态的概念。一个进程通常包括多个线程。

2.线程创建

2.1 继承Thread类

  • 自定义线程类继承Thread
  • 重写run方法
  • 使用start开启线程

线程开启不一定立刻执行,由cpu调度执行

package com.xuzhang.thread1;

public class TestThread1 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码" + i);
        }
    }

    public static void main(String[] args) {
        TestThread1 testThread1 = new TestThread1();
        testThread1.start();
        for (int i = 0; i < 200; i++) {
            System.out.println("我在学习多线程" + i);
        }
    }
}

2.2 实现Runnable接口

  • 实现自定义类用来实现Runnable接口
  • 实现run()方法
  • 使用start()启动线程
  • 由于java单继承的局限性,推荐使用runnable对象;方便一个对象被多个线程使用
public class TestThread2 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码" + i);
        }
    }

    public static void main(String[] args) {
        TestThread2 testThread2 = new TestThread2();
        new Thread(testThread2).start();
        for (int i = 0; i < 20; i++) {
            System.out.println("我在学习多线程" + i);
        }
    }
}

2.3 实现Callable接口

3.静态代理

  • 代理对象和真实对象都要实现同一个接口
  • thread实现了runnable接口,实际机制是静态代理

4.Lamda表达式

为了避免匿名内部类定义过多。

Functional Interface(函数式接口):任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。

interface Runnable{
  public abstract void run();
}

// ()-> {} 

5.线程状态

5.1 停止线程

5.2 线程休眠

  • sleep指定当前线程阻塞的毫秒数
  • 存在异常InterruptedException
  • sleep时间达到后线程进入就绪状态
  • 每一个对象都有一个锁,sleep不会释放锁

5.3 yield线程礼让

  • 让现在正在执行的线程暂停,但不阻塞;将线程从运行状态转为就绪状态;让cpu重新调度,看cpu心情。

5.4 Join强制礼让

5.5 线程状态观测state

5.6 线程的优先级

5.7 daemon守护线程

线程分为用户线程和守护线程;虚拟机必须确保用户线程执行完毕,不用等待守护线程执行完毕。守护线程如,后台记录操作日志,监控内存,垃圾回收等。

thread.setDaemon(true);

6.线程同步

并发:多个线程同时操作一个对象

队列+锁(synchronized)

6.1 使用同步方法

CopyWriteArrayList线程安全的数组,是JUC安全类型的集合

6.2 Lock

7.线程协作

7.1 问题

生产者消费者问题:

7.2 解决方法1-管程法(利用缓冲区)

7.3 解决方法2-信号灯法

8.线程池

posted on 2021-02-18 17:46  曦的问候  阅读(88)  评论(0)    收藏  举报