-
首先先了解一下进程和线程的区别
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
所处环境:在操作系统中能同时运行多个进程(程序),而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行);
内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程 -
线程状态
线程的生命周期:新建、就绪、运行、阻塞、死亡
新建(New):采用new语句创建完成
就绪(Runnable):执行start后
运行(Running):占用CPU时间
阻塞(Blocked):执行了wait语句,sleep语句或等待某个对象锁,等待输入的场合
终止(Dead):执行完run方法 -
定义线程的两种方式
1.继承Thread类
2.实现Runnable接口 -
线程控制(通过api控制线程状态之间的转换)
isAlive():判断线程是否还活着
Thread.sleep():将当前线程睡眠指定毫秒数
join():调用某线程的该方法,将当前线程与该线程合并,即该线程结束,再恢复当前线程的运行
yield():让出CPU,当前线程进入就绪队列等待调度
wait():当前线程进入对象的wait pool。
notify()/notifyAll():唤醒对象的wait pool中的一个、所有等待线程。 -
线程同步
生产者消费者问题
/**
* 生产者生产出来的产品交给店员
*/
public synchronized void produce()
{
if(this.product >= MAX_PRODUCT)
{
try
{
wait();
System.out.println("产品已满,请稍候再生产");
}
catch(InterruptedException e)
{
e.printStackTrace();
}
return;
}
this.product++;
System.out.println("生产者生产第" + this.product + "个产品.");
notifyAll(); //通知等待区的消费者可以取出产品了
}
/**
* 消费者从店员取产品
*/
public synchronized void consume()
{
if(this.product <= MIN_PRODUCT)
{
try
{
wait();
System.out.println("缺货,稍候再取");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return;
}
System.out.println("消费者取走了第" + this.product + "个产品.");
this.product--;
notifyAll(); //通知等待去的生产者可以生产产品了
}