码迷,mamicode.com
首页 > 编程语言 > 详细

Java之多线程

时间:2015-05-23 21:25:16      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:java   多线程   并发   thread   

概念:

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




Java之多线程

标签:java   多线程   并发   thread   

原文地址:http://blog.csdn.net/bear_huangzhen/article/details/45920641

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!