标签:关系 thread 唤醒 运行 java 两种 unp 依赖 消息
多线程并发编程时,难免会遇到线程间的通信问题。线程通信方式的思想大体上来说可以分为两种:共享和传递。
共享的实现方式可以是共享变量、共享文件、数据库、网络等。传递的实现方式可以是消息队列、生产者-消费者模型等。
(1)共享变量:
使用volatile 关键字定义共享变量 private static volatile Boolean odd = true。
多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。
volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。
(2)使用Object类的wait() 和 notify() 方法:
wait和 notify必须配合synchronized使用,wait方法释放锁,notify方法不释放锁。
(3)基本LockSupport实现线程间的阻塞和唤醒:
LockSupport.park(); 阻塞
LockSupport.unpark(threadB); 唤醒
(1)继承Thread类创建线程。
(2)实现Runnable接口创建线程。 多,多实现单继承。
(3)java的Executors线程池。减少对象创建, 提供定时执行、定期执行、单线程、并发数控制等功能。
创建线程需要花费资源和时间,如果等任务来创建线程那么响应时间就变长。
在程序启动时创建线程来响应处理就是线程池。
start():Thread类start()来启动一个线程,这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行。
run()称为线程体,它包含了要执行的这个线程的内容。
run(): run()方法当作普通方法的方式调用,程序还是要顺序执行。没有达到多线程目的。
(1)wait是Object方法,sleep是线程方法。
(2)wait会释放锁,sleep不释放锁。
(3)wait需要依赖synchronized关键字,sleep方法不依赖于同步器synchronized。
不同类的对象对同一消息作出不同的响应就叫做多态。
多态存在的三个条件:
(1)有继承关系。
(2)子类重写父类方法。
(3)父类引用指向子类对象,父类调用方法会调用子类重写后方法。FU fu=new ZI();
(1)final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
(2)final方法不能被子类的方法重写,但可以被继承。
(3)final类不能被继承,没有子类,final类中的方法默认是final的。
(4)final不能用于修饰构造方法。
(1)静态变量。类加载只为分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问。
(2)静态方法。静态方法可以直接通过类名调用。静态方法不能访问非静态方法。
(3)static代码块。类加载的时候就会依次执行一次静态代码块。
标签:关系 thread 唤醒 运行 java 两种 unp 依赖 消息
原文地址:https://www.cnblogs.com/chong-zuo3322/p/12684741.html