1、 多线程的创建方式
一、继承Thread类
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("子线程MyThread"+i);
}
}
}
public class ThreadText1 {
public static void main(String[] args) {
Thread t = new MyThread();
t.start();
for (int i = 0; i < 5; i++) {
System.out.println("主线程main"+i);
}
}
}
二、实现Runnable接口
前两种线程仓创建方式配存在的一个问题
假如线程执行完毕后有一些数据需要返回,他们重写的run方法均不能直接返回结果。
三、利用Callable接口,FutureTask类,来实现
2、Thread提供的方法
什么是线程安全问题?
●多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题。
3.线程同步
一、同步代码块
锁对象的使用规范
建议使用共享资源作为锁对象,对于实例方法建议使用this作为锁对象。
对于静态方法建议使用字节码(类名.class)对象作为锁对象。
二、方法锁
三、Lock锁
●lock锁是Jdk5开始提供的一个新的锁定操作,通过它可以创建出锁对象进行加锁和解锁,更灵活、更方便、更强大。
Lock是接口,不能直接实例化,可以采用它的实现类ReentrantLock来构建Lock锁对象。
4.线程通信
什么是线程通信?
当多个线程共同操作共享的资源时,线程间通过某种方式互相告知自己的状态,以相互协调,并避免无效的资源争夺。线程通信的常见模型(生产者与消费者模型)
●生产者线程负责生产数据
●消费者线程负责消费生产者生产的数据。
●注意:生产者生产完数据应该等待自己,通知消费者消费;消费者消费完数据也应该等待自己,再通知生产者生产!
5.线程池
什么是线程池?
线程池就是一个可以复用线程的技术。不使用线程池的问题
用户每发起一个请求,后台就需要创建一个新线程来处理,下次新任务来了肯定又要创建新线程处理的,而创建新线程的开销是很大的,并且请求过多时,肯定会产生大量的线程出来,这样会严重影响系统的性能。Executors工具类
并发
并行