多线程
每个线程 都有自己独立的栈空间!!!
JAVA中使用的调用方式 抢占式
线程常用方法:
- 线程名字:
public Thread(String name)
构造方法设置名字
public final String getName()
获取线程名字
public final void setName(String name)
设置线程名字
- public void start()
开启一个新线程
- public static Thread currentThread()
返回当前执行的线程的对象.
- public static void sleep(long millis) throws InterruptedException
使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)
开启多线程的方法:
一.继承Thread:
- 定义一个类继承Thread
- 重写run()方法.执行任务放在run()方法中
- 创建继承Thread的类的对象
- 调用start()方法开启新线程
二.实现Runnable 接口:
- 定义一个类实现Runnable 接口
- 重写接口的run()方法.将执行任务放在run()方法中
- 创建实现了Runnale接口的实现类对象
- 创建Thread类对象,调用Thread有参构造,把Runnale接口实现类对象传入(Runnale实现类等于线程任务,将目标与线程对象绑定)
- 线程对象(Thread)调用star()方法开始新线程.
public Thread(Runnable target)
public Thread(Runnable target,String name)
两种方式的区别:
实现Runnable 接口:
- 不能直接使用Thread类的方法
- 如果实现了Runable接口的话,很容易的实现资源共享。
- 线程池只能放入实现Runable接口或Callable类线程,不能直接放入继承Thread的类。
- 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
- 可以避免java中的单继承的局限性。
继承Thread:
- 如果一个类继承Thread,则不适合资源共享。
- 继承Thread类后不能继承其他类.
- 可以直接使用继承Thread类的方法
匿名内部类创建线程:
使用线程的内匿名内部类方式,可以方便的实现每个线程执行不同的线程任务操作。
线程安全问题:
多个线程操作同一个数据.出现于多个线程对一个变量同时进行读和写的操作
同步代码块
关键字:synchronize(锁对象){...}
锁对象:可以是任意引用数据类型对象,锁对象要保证唯一.
synchronize作用:保证一段代码只有一个线程能执行,只有这段代码执行完之后其他线程才能执行这段代码.
同步方法
普通成员方法:锁对象默认是this
静态成员方法:锁对象是该类的字节码对象 (类名.Class)
Lock锁 (接口):
ReentrantLock类实现了Lock接口.
创建ReentrantLock对象,使用lock();或 unlock();
public void lock();
获取锁.
public void unlock();
释放锁.
线程状态:
- NEW 新建 :创建线程,还未调用star().
- RUNNABLE 运行 :cpu正在执行这个线程.
- BLOCKED 阻塞 :受阻塞并等待某个监视器锁的线程处于这种状态。
- WAITING 无限等待:无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
- TIMED_WAITING 计时等待:等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
- TERMINATED 销毁 :线程执行完毕任务已退出的线程处于这种状态。
wait&¬ify
- 同步锁 调用此方法.
- 必须存在于同步代码块中.
- public final void wait() throws InterruptedException
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。
- public final void notify()
唤醒在此对象监视器上(同步锁)等待的单个线程。
- public final void notifyAll()
唤醒在此对象监视器(同步锁)上等待的所有线程。
单例设计模式
作用:保证一个类只有一个对象,这样所有的属性都是唯一的,多用数据共享的时候可以采用单例设计模式
饿汉式:
1.私有化构造函数
2.提供一个静态的私有的本类的对象
3.提供一个静态的get方法将本类对象返回
懒汉式:
1.私有化构造函数
2.提供一个静态的私有的本类的引用
3.提供一个静态的get方法将本类对象返回,如果对象没有初始化,创建出来
问题:
线程安全问题,如果有多个线程同时创建对象的时候可以出现多个对象
解决:
添加同步锁
程序员式:
1.私有化构造函数
2.2.提供一个静态的公共的,最终的本类的对象