概念:
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