一、同步和异步
1、同步就是A调用B,调用一旦开始,A必须等到B调用返回结果后,才能继续后续的行为。
2、异步就是A调用了B方法但是不需要等待B方法返回的结果,就能继续执行A方法中剩下的内容。
3、线程同步和异步:一个进程启动的若干个不相关进程,他们之间的相互关系为异步;同步必须执行到底后才能执行其他操作,异步可同时执行。
(多个线程在执行的过程中是不是使用同一把锁。如果是,就是同步;否则就是不同步)
4、线程概念
二、 继承Thread类实现多线程
步骤:
1、 自定义线程类继承Thread类;
2、 重写run()方法,编写线程执行体;
3、 创建线程对象,调用start()开启线程。线程开启不一定立即执行,由CPU调度执行。
// 1、自定义线程类
public Class TestThread extends Thread{
//2、重写run()方法
@Override
public void run(){
//线程方法体内容
}
}
public static void main(String[] args){
//3、创建线程对象
TestThread t1 = new TestThread();
t1.strart();
}
注意:
三、实现Runnable接口,重写run方法
步骤:
1、定义类实现Runnable接口;
2、重写run()方法,编写线程执行体;
3、创建线程对象,调用start()启动线程;
public Class TestThread implements Runnable{
@Override
public void run(){
//线程方法体内容
}
}
public static void main(String[] args){
//创建线程对象
TestThread t1 = new TestThread();
Thread t = new Thread(t1);
//启动
t.strart();
}
【对比】:
1、源码角度,Thread实现了Runnable接口,提供了更多的可用方法和成员。
2、无论Thread 和 Runnable 都会new Thread(),然后执行run()方法。
四、实现Callable接口
public Class TestThread implements Callable<Boolean>{
@Override
public Boolean call(){
//线程方法体内容
return true;
}
}
public static void main(String[] args){
//创建线程对象
TestThread t1 = new TestThread();
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交结果
Future<Boolean> r1 = ser.submit(t1);
//获取结果
boolean rs1 = r1.get();
//关闭服务
ser.shutdownNow();
}
优点:
1、可以定义返回值
2、可以抛出异常
五、线程状态
六、线程方法
七、锁
1、synchronized
2、Lock
3、对比
八、死锁
九、线程通信
十、线程池