一、多线程的两种实现
Thread类
1、public Thread()
2、public Thread(Runable target)
3、public Thread(String ThreadName)
4、public Thread(Runable target,String ThreadName)
常用方法:start()、sleep()、setName()、setPriority()、MAX_PRIORITY属性、isAlive()
Runable接口
Thread thread=new Thread(new XXXRunable);
二、线程的状态
1、新建状态:new以后的状态
2、就绪状态:start()以后的状态
3、运行状态:run()以后
4、阻塞状态:sleep()或join()以后、时间完成以后进入就绪状态、不放弃对象锁
5、等待状态:wait()以后、自动放弃对象锁、只能当调用notify()或nofifyAll()方法此线程进入锁池状态
6、锁池状态:从锁池状态出去进入就绪状态
7、终止状态:完成
三、线程同步
两个线程同时操作同一个资源,会造成数据错乱的问题,所以要进行线程同步。
线程同步实现方法:
1、方法:synchronized void methodA(){}
2、代码块:synchronized(object){}
用synchronized执行的方法和代码块必须是单线程的、多个线程同时执行必须排队。
四、线程间通信
主要使用:wait()、nofity()、notifyAll()这戏方法作为Object类的final方法出现的,这三个方法只能在synchronized方法中调用
1、wait():告知被调用的线程退出监视器并进入等待状态、直到其他线程进入相同的监视器并调用notify()、调用的线程将放弃CPU、放弃对象锁、进入监视器的等待池。
2、notify():通知第一个调用的wait()的线程、notifyall是所有线程、进入就绪状态、重新获得监视器的锁定才能继续。
相关代码供理解:
import java.util.LinkedList;
public class Pool {
private LinkedList<Integer> store=new LinkedList<>();
int MAX=20;
public synchronized int add(Integer i){ //解决线程安全的问题
if(store.size()>MAX){
try {
wait(); //解决死锁生产者消费者问题(防止爆仓)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
store.add(i);
notifyAll(); //通知所有进程抢占CPU,解决死锁的问题(生产者消费者都在等待队列中,notify的话只能唤醒一个,如果是消费者,此时仓中没有东西,一直是消费者,会引发死锁的问题)
return i;
}
public synchronized int remove(){
if(store.isEmpty()){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int n=store.removeFirst();
notifyAll();
return n;
}
}