概念:
1.线程:程序中单独顺序的控制流
线程本身依靠程序进行运行
线程是程序中的顺序控制流,只能使用分配给程序的资源和环境
2.进程:执行中的程序
一个进程可以包含一个或多个线程
一个进程至少要包含一个线程
3.单线程:程序中只存在一个线程,实际上主方法就是一个主线程
4.多线程:多线程是一个程序中运行多个任务
多线程的目的是更好的使用CPU资源
线程的状态:
创建状态:准备好了一个多线程的对象;
就绪状态:调用了start()方法,等待CPU调度;
运行状态:执行run()方法;
阻塞状态:暂时停止执行,可能将资源交给其他线程使用;
终止状态(死亡状态):线程销毁;
线程常用方法:
1.取得线程名称getName()
2.取得当前线程对象currentThread()
3.判断线程是否启动isAlive()
4.线程的强行运行join()
5.线程的休眠sleep()
6.线程的礼让yield()
线程的同步与死锁:
1.同步代码块
在代码块上加上"synchronized"关键字,则此代码块就称为同步代码块
2.同步代码块格式
synchronized(同步对象){
需要同步的代码块;
}
3.同步方法
除了代码块可以同步,方法也可以同步的
4.方法同步格式
synchronized void 方法名称(){}
线程的同步经典示例:
模拟某车站有三个窗口同时卖票,总票数为10张,卖完为止,代码如下:
//卖票线程
class MyThread implements Runnable {
// 原始票数为10张票
private int ticket = 10;
@Override
public void run() {
// 死循环卖票
while (true) {
if (ticket > 0) {
try {
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()
+ "卖掉一张票...");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("剩余票数:" + --ticket);
} else {
// 票已经卖完,窗口停止售票
break;
}
}
}
}
public class Test001 {
public static void main(String[] args) {
// 现在有三个窗口同时在卖票
MyThread r = new MyThread();
Thread t1 = new Thread(r, "窗口一");
Thread t2 = new Thread(r, "窗口二");
Thread t3 = new Thread(r, "窗口三");
// 开始并发卖票
t1.start();
t2.start();
t3.start();
}
}
程序运行结果如下:
窗口一卖掉一张票... 剩余票数:9 窗口三卖掉一张票... 剩余票数:8 窗口二卖掉一张票... 剩余票数:7 窗口一卖掉一张票... 剩余票数:6 窗口三卖掉一张票... 剩余票数:5 窗口二卖掉一张票... 剩余票数:4 窗口三卖掉一张票... 剩余票数:3 窗口一卖掉一张票... 剩余票数:2 窗口二卖掉一张票... 剩余票数:1 窗口一卖掉一张票... 剩余票数:0 窗口三卖掉一张票... 剩余票数:-1 窗口二卖掉一张票... 剩余票数:-2
因为三个窗口是并发卖票,所以当票只剩下一张的时候,三个窗口同时去卖它,就会造成剩余票数变成负数,这个时候就需要同步的访问这个车票资源来解决这个问题,代码修正后如下:
//卖票线程
class MyThread implements Runnable {
// 原始票数为10张票
private int ticket = 10;
@Override
public void run() {
// 死循环卖票
while (true) {
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()
+ "卖掉一张票...");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("剩余票数:" + --ticket);
} else {
// 票已经卖完,窗口停止售票
break;
}
}
}
}
}
public class Test001 {
public static void main(String[] args) {
// 现在有三个窗口同时在卖票
MyThread r = new MyThread();
Thread t1 = new Thread(r, "窗口一");
Thread t2 = new Thread(r, "窗口二");
Thread t3 = new Thread(r, "窗口三");
// 开始并发卖票
t1.start();
t2.start();
t3.start();
}
}
窗口一卖掉一张票... 剩余票数:9 窗口一卖掉一张票... 剩余票数:8 窗口一卖掉一张票... 剩余票数:7 窗口三卖掉一张票... 剩余票数:6 窗口三卖掉一张票... 剩余票数:5 窗口三卖掉一张票... 剩余票数:4 窗口二卖掉一张票... 剩余票数:3 窗口二卖掉一张票... 剩余票数:2 窗口二卖掉一张票... 剩余票数:1 窗口二卖掉一张票... 剩余票数:0
原文:http://blog.csdn.net/bear_huangzhen/article/details/45920641