JAVA-基础(线程)
Posted fan123yh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-基础(线程)相关的知识,希望对你有一定的参考价值。
1.什么叫并发?
多个线程在同一时间段运行(交替运行)。
2.什么叫并行?
是指多个处理器(cpu),多个线程在同一时刻运行。
3.什么叫进程?
一个个的软件就是一个进程。
4.什么叫线程?
在进程中,有多线程在同时工作。
5.java线程的原理?
一但创建一个线程,首先会发送一个通道到cpu,线程来抢占cpu的执行权。
6.java实现线程?
(1).继承Tread类
1.重写run方法.
2.创建类.
3.start().
(2).实现runable接口
1.重写run方法.
2.创建类。
3.Thread th =new Thread(类);
4.start().
7.java线程哪个比较好?
实现runable比较好,原因:继承属于单继承,实现可以多实现。
8.java线程常用方法?
run 线程方法配置,线程运行.
start 线程启动。
sleep 线程睡眠。
9.多线程安全问题的产生原因?
当我们用到共享资源的时候,就会出现多线程安全问题。
10.解决多线程安全问题?
(1).使用同步代码块
synchronized(任意的对象(锁) )
写要被同步的代码
所谓的锁,是指一个对象,即多个线程共用的对象。
解释:当一个线程抢占到锁的时候,别的线程如果要运行这一段代码,就要先阻塞,等待锁对象释放。
(2).同步方法
public synchronizd void pay()
.......
把访问了的共享数据代码抽取出来放到一个方法中,在方法上添加synchronizd修饰符。同步方法的锁对象就是实现类对象。
注意事项:
在同步方法上加static修饰符就是静态同步方法。
静态同步方法锁对象就是本类的calss属性也叫calss文件对象(反射)。
(3).lock锁
lock锁比synchronizd使用更加方便。 lock是一个接口,是主要常用的方法主要有lock(获取锁)和unlock(释放锁对象)。lock的实现类主要有Reentrantlock。
使用步骤:
1.在成员位置创建一个向上转型的lock对象。
2.在共享代码之前,调用lock方法获取锁对象。
3.在共享代码之前,调用unlock方法释放锁对象。
注意事项:注意如果出现共享代码异常,用finally最后释放锁对象,否则容易出现死锁。
11.线程各个状态?
新建状态,阻塞状态,运行状态,死亡状态,睡眠状态,无限等待状态。
新建状态:就是在新建线程的时候。
阻塞状态:就是具备cup执行资格,等待cup空闲时执行。与其他线程进行抢占。
运行状态:当前线程运行。
睡眠状态:放弃执行cup的资格,就算优先级比较高也不执行,直至睡眠时间结束。
无限状态:wait()方法,使线程进入睡眠状态。但是没有设置时间,所以除非等到调用notify方法才可以结束当前状态。
死亡状态:run方法结束或者调用stop方法。
新建状态--->阻塞状态 优先级比较低,所以就会进入阻塞状态。
新建状态--->运行状态 优先级比较高,所以抢占到cpu的运行权力。
运行状态--->阻塞状态 优先级比较高,所以抢占到cpu的运行权力。
运行状态--->睡眠状态 调用sleep wait(long)方法,使线程进入睡眠状态。
运行状态--->无限状态 调用 wait()方法,使线程进入睡眠状态。
运行状态--->死亡状态 run方法结束或者调用stop方法。
12.java线程通信
(1).目的?
解决多个线程并发运行,提高cup利用,让多个线程进行协调。
(2)原理?
主要用到的方法有就是wait与notify唤醒机制。
(3)wait与notify?
wait方法如果不加参数,线程就会进入无限等待状态,直至调用notify方法。
notify是object对象的方法,要求wait与notify必须是同一个锁对象,同时java多线程通信需要用到同步技术,而实现lock接口不行, 因为他们需要同一锁对象(对象监听器)。 如果锁对象不一样,notify只会唤醒该对象持有的线程。
wait方法满足队列的方式,最先睡着的线程,最先唤醒。
如果线程从无限等待状态被唤醒,不会立即进入运行状态,会首先判断cup是否空闲。
13.线程池?
(1).原理?
所谓的线程池其实就是一个容器:也就是集合(ArrayList(),hashSet(),linkList<Thread>,HashMap)线程池就用到了linkList<Thread>。他是一个队列,也就是满足先进后出的原则。当我们程序第一次运行时,会创建多个线程,保存到一个集合中。当我们使用完后,就会归还线程池。
(2).使用优点?
1.降低资源消耗。
2.提高响应速度。
3.提高线程可管理性。
(3).注意事项?
java中线程池的顶级接口是java.util.concurrent.Executor,他是一个执行线程的工具,真正的线程池接口是java.util.concurrent.ExecutorService 。
static ExecutorService newFixedThreadPool(int nthread)创建一个可重用的固定线程数的线程池,从线程池中获取线程,调用start方法。submit(Runable task) 提交一个Runable任务用于执行。
关闭销毁线程池的方法 void shutdown()。
(4)调用线程的步骤?
1.使用线程池工厂类Executor里边提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池。
2.创建一个类实现runable接口,重写run方法,设置线程任务。
3.调用ExecutorService submit方法传递实现类(即重写的接口实现类),开启线程,执行run方法。
4.掉用shutdown方法,销毁线程,(不建议执行)。
以上是关于JAVA-基础(线程)的主要内容,如果未能解决你的问题,请参考以下文章