Java多线程详解
Java.Thread
线程简介
线程 进程 多线程
线程实现
-
Thread 继承Thread类
调用run方法只有主线程一个线程,调用start方法生成子线程与主线程并行执行。 -
Runnable 实现Runnable接口
-
Callable(扩充)
Lamda表达式
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
对于函数式接口,我们可以通过lambda表达式来创建该接口的对象。
//静态内部类实现函数式接口
static class Like2 implements ILike{
@override
public void lambda(){
System.out.println("1");
}
}
//局部内部类
class Like3 implements ILike{
@override
public void lambda(){
System.out.println("2");
}
}
//匿名内部类
like= new Ilike(){
@override
public void lambda(){
System.out.println("3");
}
}
//用lambda简化
like=()->{
System.out.println("4");
};
//继续简化 因为单行代码
like=()->System.out.printlin("5");
线程状态
五大状态
线程方法
停止线程
不推荐使用JDK提供的stop()、destroy()方法。
线程休眠
Thread.Sleep(2000),会抛出异常
线程礼让
让当前正在执行的线程暂停,但不阻塞。不一定成功,取决于CPU调度。
线程强制执行join
Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞。
线程状态
thread.getState()
守护线程
daemon
Thread.setDaemon()
线程同步
加synchronized关键字就成为了同步方法。
public synchronized void method(int args){}
这种方法默认锁的是类对象本身。
synchronized块
synchronized(obj){}
加了锁
缺陷:若将一个大的方法申明为synchronized 将会影响效率。
显式锁
显式定义锁Lock
java.util.concurrent.locks.Lock接口
ReentrantLock类(可重入锁)实现了Lock
//显式的定义锁
class TestLock implements Runnable{
int ticketNums = 10;
//定义lock锁
private final ReentrantLock lock = new ReentrantLock();
@override
public void run(){
while(true){
try{
lock.lock();
if(ticketNums>0){
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(ticketNums--);
}
else{break;}
}finally{
lock.unlock();
}
}
}
}
线程间通信
生产者消费者模式
管程法
利用缓冲区解决
信号灯法
利用一个标志位解决
###线程池
ExecutorService serivce = Executors.newFixedThreadPool(10);
serivce.excute(new myThread());
serivce.excute(new myThread());
serivce.excute(new myThread());
serivce.shutdown();