`
dawuafang
  • 浏览: 1100186 次
文章分类
社区版块
存档分类
最新评论

Android开发之多线程编程Thread和Runnable使用

 
阅读更多


Android可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;前者只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是Java中一个类只能继承一个父类,这是这种方式的局限性,后者只需要实现一个接口而已,Java中可以实现多个接口。



继承Thread类

package com.vixtel.tools;


/**
 * @author yangxiaolong
 * @2014-7-28
 */
public class SyncThread extends Thread {

	@Override
	public void run() {
		synchronized (this) {
			for (int i = 0; i < 5; i++) {
				System.out.println(Thread.currentThread().getName()
						+ "   synchronizedloop " + i);
			}

		}

	}

}

运行:

			SyncThread st1 = new SyncThread();
			SyncThread st2 = new SyncThread();
			st1.start();
			st2.start();

Runnable接口

package com.vixtel.tools;


/**
 * @author yangxiaolong
 * @2014-7-28
 */
public class SyncRunnable implements Runnable {

	@Override
	public void run() {
		synchronized (this) {
			for (int i = 0; i < 5; i++) {
				System.out.println(Thread.currentThread().getName()
						+ "   synchronizedloop " + i);

			}

		}

	}

}

执行:

			 SyncRunnable sr1 = new SyncRunnable();
			 SyncRunnable sr2 = new SyncRunnable();
			
			 Thread td1 = new Thread(sr1, "td1");
			 Thread td2 = new Thread(sr2, "td2");
			 //多个Thread也可以同时使用一个Runbale,
			 //由于多个Thread操作同一个Runnable对象,这样同步锁就需要使用了
			 td1.start();
			 td2.start();


接下来使用经典的模拟火车卖票程序,来理解Thread和Runnable在特定场景下的区别和联系,以及synchronized在线程中的作用:

	class AutoSaleTicket implements Runnable {
		private int ticket = 20;

		public void run() {

			while (true) {// 循环是指线程不停的去卖票
				// 当操作的是共享数据时,用同步代码块进行包围起来,这样在执行时,只能有一个线程执行同步代码块里面的内容
				synchronized (this) {
					if (ticket > 0) {

						// 不要在同步代码块里面sleep,作用只是自已不执行,也不让线程执行
						System.out.println(Thread.currentThread().getName()
								+ " 卖出 第 " + (20 - ticket + 1) + " 张票");
						ticket--;

					} else {
						break;
					}
				}
				// 所以把sleep放到同步代码块的外面,这样卖完一张票就休息一会,让其他线程再卖,这样所有的线程都可以卖票
				try {
					Thread.sleep(200);
				} catch (Exception ex) {
				}
			}
		}
	}

我们开始执行售票程序:

			AutoSaleTicket ticket = new AutoSaleTicket();
			Thread t1 = new Thread(ticket, "东城代售");
			Thread t2 = new Thread(ticket, "西城代售");
			Thread t3 = new Thread(ticket, "朝阳代售");
			Thread t4 = new Thread(ticket, "海淀代售");
			t1.start();
			t2.start();
			t3.start();
			t4.start();

结果:


版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics