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.线程池


浙公网安备 33010602011771号