Android多线程

Android中线程的使用

  • Java中线程的四种创建方式
      • 1.继承Thread类
      • 2.实现runable接口 创建线程
      • 3.使用Callable和Future创建线程
      • 4.线程池
  • Android中的线程

Java中线程的四种创建方式

1.继承Thread类

public class Demo1 {
     
	public static void main(String[] args) {
     
		MyThred m = new MyThred();//新建线程子对象
		m.start();	//开启线程,执行run方法
		
		for (int i = 0; i < 10000; i++) {
     
			System.out.println("aaaaaaaaaaaaaaaaaaaaa");
		}
	}
}
class MyThred extends Thread {
     
	@Override
	public void run() {
      //重写run方法
		for (int i = 0; i < 10000; i++) {
     
			System.out.println("线程");
		}
	}
}

好处 : 可以直接使用Thread类中的方法 代码简单
弊端 : 如果已经有了父类 就不能使用这种方法 (java单继承)

2.实现runable接口 创建线程

public class demo_runable {
     
	public static void main(String[] args) {
     
		myRunnable mr = new myRunnable();//Runable是接口 
		Thread t = new Thread(mr); 
		t.start();
		
		for (int i = 0; i < 10000; i++) {
     
			System.out.println("aaaaaaaaaaa");
		}
	}
}
class myRunnable implements Runnable {
     
	@Override
	public void run() {
     
		// TODO Auto-generated method stub
		for (int i = 0; i < 10000; i++) {
     
			System.out.println("线程");
		}
	}
}

编译看父类 运行看子类

runable源码:
 //1   
 public Thread(Runnable target) {
     
        init(null, target, "Thread-" + nextThreadNum(), 0);}
//2       
this.target = target;   局部变量 赋给成员变量
//3 
 @Override
    public void run() {
     
        if (target != null) {
     
            target.run();
        }
    }   

构造函数中传入了Runable的引用 成员变量记住了她 start调用run方法时
内部判断成员变量是否为空 执行子类的Run方法

好处 : 即使自己定的的线程有了父类也没有关系 因为有了父类 也可以实现接口 而且接口是可以多实现的
弊端 : 不能直接使用Thread的方法 需要先获取到线程对象后 才能得到Thread方法 代码复杂

new class(){} 继承这个类

匿名内部类 :

public class demo_noName {
     
	public static void main(String[] args) {
     
     
		new Thread() {
     
			@Override
			public void run() {
     
				for (int i = 0; i < 10000; i++) {
     
					System.out.println("bb");
				}
			}
		}.start();

		new Thread(new Runnable() {
     
			@Override
			public void run() {
     
				for (int i = 0; i < 10000; i++) {
     
					System.out.println("aaaaaaaaaaaaaaa");
				}
			}
		}).start();
	}
}

获取修改线程名字 this.getName()

3.使用Callable和Future创建线程

和Runnable接口不一样,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能要强大。
call()方法可以有返回值 ,可以声明抛出异常
这个不常用,在此不提了。

4.线程池

新手玩安卓,暂时用不到吧。。。(我还没用到过:( )

Android中的线程

有什么不一样吗?没有。
那就再继续说一下概念和常用方法吧。
默认情况下,程序只有一条执行的流程,这个执行的流程就是主线程。
ANR(Application Not Responding,程序未响应)
出现的原因就是主线程的执行顺序流被某个耗时的操作阻塞了,导致后续的操作无法及时响应。
这个时候系统处于保护的机制会弹出窗口。
使用情景:
应用程序需要执行耗时操作(IO、网络等)的同时又要执行UI交互。
这种情况下应该使用多线程。

主线程:

  1. 默认线程
  2. 负责UI操作
  3. 严禁耗时操作

子线程:

  1. 需要手动开启
  2. 执行完毕后自动关闭
  3. 负责耗时操作
  4. 严禁UI操作

UI(主线程)要显示耗时操作(子线程)的结果。在子线程中发送消息给主线程。
匿名内部类很常用
线程间通信,很重要,且看下回分解

你可能感兴趣的:(Android,android,多线程,java)