黑马程序员
------- android培训、java培训、期待与您交流! ----------
多线程:
进程:是一个正在执行的程序;
线程:就是进程中一个独立的控制单元,控制着进程的执行;
一个进程中至少有一个线程;
自定义线程:
第一种方式:
通过查找API找到java对线程的描述Thread类可以通过继承;
第一步:定义一个类继承Thread;
第二步:复写Thread类中的run方法(为了将自定义的代码储存在run方法中让线程运行);
第三步:调用线程的start方法(启动线程调用run方法);
线程的运行状态:
被创建,运行,冻结(sleep、wait、notify)临时状态阻塞,消亡;
获取线程的对象及名称:
原来线程都有自己的默认名称Thread—编号(从0开始)
static.Thread currentThread()获取当前线程对象;
getName()获取线程名称;
setName()获取线程的名称;
第二种方式:
实现Runnale接口;
第一步:定义一类实现Runnnable接口;
第二步:覆盖Runnable接口中的run方法将线程要运行的代码放在该run方法中;
第三步:通过Thread类建立线程对象;
第四步:将Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数
第五步:调用Thread类中的start方法启动线程并调用Runnable接口子类中的run方法;
实现方式的好处:
避免了单继承的局限性,在定义线程时建议用实现的方法;
多线程的安全问题:
当多条语句在操作同一线程的共享数据时,一个线程只执行了多条语句的一部分还没有执行完另一个线程就进来导致错误发生;
java对于多线程安全问题有专门的解决方式:
同步代码块:synchronized(对象){需要被同步代码}
同步的前提;
必须有两个或两个以上的线程执行操作;
同步的好处和弊端:
好处:解决安全问题;
弊端:多个线程需要判断锁较为消耗资源;
如何找到问题:
1、明确哪些代码是多线程运行代码;
2、明确共享数据;
3、明确多线程运行代码中哪些语句是操作共享数据的;
同步函数:
同步函数的锁是this,因为函数需要被对象调用,那函数都有一个所属对象引用this
多线程静态同步函数:
静态同步函数锁是:class对象静态进内存时内存中没有本类对象但是一定有该类对应的字节码文件对象类名.class该对象的类型是class;
如何停止线程:
只有一种方法run方法结束;
开启多线程运行,运行代码通常是循环结构,只要控制住住循环就可以让run方法结束;