Android可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;前者只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是Java中一个类只能继承一个父类,这是这种方式的局限性,后者只需要实现一个接口而已,Java中可以实现多个接口。
继承Thread类
- package com.vixtel.tools;
-
-
-
-
-
-
- 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;
-
-
-
-
-
-
- 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");
-
-
- 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) {
-
-
- System.out.println(Thread.currentThread().getName()
- + " 卖出 第 " + (20 - ticket + 1) + " 张票");
- ticket--;
-
- } else {
- break;
- }
- }
-
- 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();
结果:
![](https://img-blog.csdn.net/20140728175927251?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFkMTk4OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Android可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;前者只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是Java中一个类只能继承一个父类,这是这种方式的局限性,后者只需要实现一个接口而已,Java中可以实现多个接口。
继承Thread类
- package com.vixtel.tools;
-
-
-
-
-
-
- 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;
-
-
-
-
-
-
- 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");
-
-
- 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) {
-
-
- System.out.println(Thread.currentThread().getName()
- + " 卖出 第 " + (20 - ticket + 1) + " 张票");
- ticket--;
-
- } else {
- break;
- }
- }
-
- 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();
结果:
![](https://img-blog.csdn.net/20140728175927251?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFkMTk4OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)