一、线程
a) 概述
宏观来讲
进程:就是正在运行的程序
线程:就是进程的执行路径,执行单元
b) 创建线程的两个方式
i. 定义一个类继承Thread
public class A extends Thread{
}
new A().start();
ii. 定义一个类实现Runnable
public class A implements Runnable{
public void run(){
}
}
new Thread(new A()).start();
c) 线程的随机性原理
多个程序实际是通过CPU在做高效切换实现的
d) 线程的生命周期
新建 --> 就绪 --> 运行 -->阻塞 --> 死亡
e) 卖票的例子
packagecn.itcast.thread;
/**
* 卖票资源类
*
* @author LBK
*
*/
public classRunnableForTickets implements Runnable {
private static int tickets = 100;
@Override
public void run() {
while (true) {
if (tickets > 0) {
try {
Thread.sleep(500);
} catch(InterruptedException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ "正在出售第"
+tickets-- + "张票");
} else {
break;
}
}
}
}
package cn.itcast.thread;
/**
* 测试类
* @author LBK
*
*/
public class TicketThread {
public static void main(String[] args) {
RunnableForTickets runnable=new RunnableForTickets();
Thread t1=new Thread(runnable,"窗口一");
Thread t2=new Thread(runnable,"窗口二");
Thread t3=new Thread(runnable,"窗口三");
t1.start();
t2.start();
t3.start();
}
}
问题出现原因:
比如现在票数是1张,线程三抢到CPU执行然后休眠
此时线程二抢到CPU执行,也是1>0,符合条件,然后休眠,
线程三减一以后,线程二也要减一,遍出现了-1张的情况。
如何查找多线程是否存在问题呢?
查看是否有共享数据
看操作共享数据的语句是不是多条
看是不是在多线程环境中
解决方案:加锁
packagecn.itcast.thread;
/**
* 卖票资源加锁了类
*
* @author LBK
*
*/
public classRunnableForTickets implements Runnable {
private static int tickets = 100;
private Object lock = new Object();
@Override
public void run() {
while (true) {
synchronized (lock) {
if (tickets > 0){
try {
Thread.sleep(500);
} catch(InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+"正在出售第" +tickets-- + "张票");
} else {
break;
}
}
}
}
}