Day16 JavaSE基础复习 (23)多线程(上) (24)多线程(下)
2019-05-26 21:08
393 查看
(23)多线程(上)
- 并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。需要多核CPU
并发是指两个任务都请求运行,而处理器只能接收一个任务,就把这两个任务轮流进行,时间间隔很短 - 多线程实现方式:
2.1.定义一个类继承Thread,重写run方法,将要执行的代码写在run方法中。创建该类的对象,引用.start(); 开启线程
2.2.定义一个类实现Runnable,重写run方法,创建该类的对象,new Thread(引用).start(); 开启线程 - 匿名内部类实现线程的两种方式
3.1 new Thread(){ 重写run方法 }.start();
3.2 new Thread( new Runnable() {重写run方法} ).start(); - Thread.currentThread(); //获取当前的线程 为了协助3.2中Runnable的,因为Runnable的子类不能直接调用Thread方法
- Thread.sleep(1000); //停止1秒 ,1000毫秒 会抛出中断异常
- Thread.setDaemon(true); //当传入true , 就意味着设置为守护线程 ,,其他线程结束后,守护线程也随之结束
- Thread.yield(); //礼让线程
- Thread.setPriority(5); //设置优先级 范围1-10 10最高,1最小,5默认
- synchronized关键字
synchronized(对象){ }; //同步代码块,锁机制,锁对象是任意的。不能用匿名对象,因为匿名对象不是同一个对象
同步方法,只需要在方法上加synchronized关键字即可
非静态的同步方法锁对象是this
静态的同步方法的锁对象是该类的字节码对象,类名.class
如果用引用数据类型成员变量当作锁对象,必须是静态的 - Vector是线程安全的 ArrayList是线程不安全的
StringBuffer是线程安全的 StringBuilder是线程不安全的
Hashtable是线程安全的 HashMap是线程不安全的
Collections.synchronizedList(List<T> list ); //可以将线程不安全的集合转换成线程安全的
(24)多线程(下)
一.多线程(下)
- 单例设计模式
构造方法私有化,声明一个私有的引用,对外提供公共的访问方法
懒汉式:单列的延迟加载模式,在方法中判断引用指向是否为null,是就创建对象
饿汉式:在声明引用时,就已经创建了对象,访问方法中直接返回该引用 - Timer t = new Timer();
//第一个参数,是安排的任务;第二个参数,是执行的事件;第三个参数,是过多长时间再执行
t.schedule(new TimerTask的子类,new Date(年份-1990,月份-1,day,时,分,秒),间隔时间); - 在同步代码块中,用哪个对象锁,就用哪个对象的的wait方法
- 因为锁对象可以是任意对象,Object是所有的类的基类,所以wait方法和notify需要定义在Object中
- sleep方法和wait方法的区别
a. sleep方法必须传入参数,参数就是时间,时间到了自动醒来
wait方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不传入参数就是直接等待
b. sleep方法在同步函数或同步代码中,不释放锁
wait方法在同步函数或同步代码中,释放锁 - 互斥锁 (JDK1.5的特性)
ReentrantLock r = new ReentrantLock();
Condition c1 = r.newCondition();
Condition c2 = r.newCondition();
Condition c3 = r.newCondition();
在同步代码块前后加上 r.lock(); 和 r.unlock();
r.lock(); 根据判断条件 c1.await(); 不符合条件就执行,然后最后唤醒c2 c2.signal(); r.unlock();
r.lock(); 根据判断条件 c2.await(); 不符合条件就执行,然后最后唤醒c3 c3.signal(); r.unlock();
r.lock(); 根据判断条件 c3.await(); 不符合条件就执行,然后最后唤醒c1 c1.signal(); r.unlock(); - 线程组ThreadGroup
ThreadGroup tg = new ThreadGroup("name"); //创建新的线程组
MyRunnable mr = new MyRunnable(); //创建Runnable的子类,重写了run方法
Thread t1 = new Thread(tg,mr,"name1"); //将线程t1放在组中
Thread t2 = new Thread(tg,mr,"name2"); //将线程t2放在组中 - 线程池
ExecutorService pool = Executors.newFixedThreadPool(2); //参数2意思是线程池中可以放两个线程
pool.submit(new MyRunnable()); //将线程传入线程池中
pool.submit(new MyRunnable()); //将线程传入线程池中
pool.shutdown(); //关闭线程池
相关文章推荐
- JavaSE_ 多线程 总目录(23~24)
- javase复习整理(一):基础要点、重点、易错点、多线程梳理总结
- JavaSE基础复习六:多线程
- JavaSe基础XX23——HTML
- JavaSE复习之十二 高级特性:并发 (多线程) 补充(2)
- 复习基础--JAVA多线程-获取函数返回结果
- java基础24 线程、多线程及线程的生命周期(Thread)
- JavaSe总结-24- 多线程(2)
- Java基础进阶_day16_(多线程,互斥锁,线程池,定时器,设计模式)
- JavaSE复习之四 基础知识:集合 补充(1)
- javase基础复习攻略《七》
- 黑马程序员_JavaSE基础12 之 导入包 多线程的创建
- 复习基础-Java多线程-Join用法
- 复习基础-JAVA多线程,主线程等待子线程分析
- JAVASE基础-day16(集合之List集合)
- 面试复习-javaSE基础篇
- 【java基础】多线程--生产者消费者--复习
- JavaSE进阶知识学习----多线程基础知识-1
- JavaSE基础复习-2
- javaSE基础编程——多线程(生产者和消费者)