1.程序,进程,线程
程序:是静态,一些文件的集合,可运行。
进程:当一个程序启动时就启动了一个进程。
线程:程序的不同的执行路径,主函数的执行就是主线程,其实都是线程的执行。
线程的执行是CPU的调度机制。
2.线程的创建和启动
class A extends Thread{
public void run(){
}
}
A a = new A();
a.start();//将线程放入可执行的队列中,等待系统调度执行
-------------------------------------------------
class B implements Runnable{
public void run(){
}
}
B b = new B();
Thread t = new Thread(b);
t.start();
-------------------------------------------------
class C extends TimerTask{
public void run(){
}
}
C c = new C();
Timer t = new Timer();
t.schedule(c, 1000, 2000);
3.线程的通信
监视线程--用于监视其他线程的状态。
生产/消费 wait/notify机制
wait让访问该对象的线程等待,只有当该对象再调用notify的时候等待的线程才会重新进入就绪状态
4.线程的同步
一。同步和异步
线程本身的异步的(并行)
在某些地方需要让线程同步
如何实现线程同步???
1. 锁住某个代码块
synchronized (需要同步的对象) {
// 需要同步的代码
}
2. 锁住某个方法
public synchronized void quqian(int n) {
}
3.使用锁对象
//创建锁
Lock l = new ReentrantLock();
//上锁
l.lock();
//需要同步的代码块
//解锁
l.unlock();
二、 生产者和消费者模型
1、容器,在往容器添加的时候不能往外拿,在往外拿的时候不能往里添加,也就是同步。
2、可以直接利用LinkedBlockingDeque
put()方法
//放入元素,如果容量不够,就等待
take()方法
// 从队列中移除元素,如果队列中没有元素,则等待
5.线程的暂停,停止模型
线程暂停:
sleep(1000) // 睡着了也是抱着锁
wait(); //释放锁,需要被唤醒
线程的停止:
必须是run方法自然结束
多线程游戏需要暂停
run(){
while(是否停止){
if(是否暂停){
//逻辑代码
}
}
}
6.线程的状态
New Thread(新建状态):当线程对象被创建的时候
Runnable(就绪,可执行):当调用完线程的start方法之后
Running(运行时状态):线程正在执行run方法
Not Runnable(非运行状态,阻塞状态,暂停状态,挂起状态):当线程sleep,wait的时候
Dead(死亡状态,终止状态):线程的run方法执行完毕