Java多线程
GraysonWP
路虽远,行则将至。天道酬勤,厚积薄发。
展开
-
线程的状态有哪些,各自的使用场景是什么?
新状态:线程被创建出来,但是还没有调用start()方法。可运行状态:线程有资格运行,但调度程序还没有把它选定为运行线程时所处的状态,此时正在等待操作系统分配资源、等待IO;连接,当satrt()方法调用时,线程首先进入可运行状态,在线程运行之后或者从阻塞、等待、睡眠状态回来后,也返回到可运行状态。Running(运行状态):线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态,实际上这三个状态组合为一种,其共同点是线程仍旧是获得,.原创 2020-06-26 18:02:12 · 468 阅读 · 0 评论 -
多个线程间如何共享数据?
如果每个县城执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据。将共享数据封装成另一个对象,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上,这样容易实现针对数据进行各个操作的互斥和通信。将Runnable对象作为一个类的内部类,共享数据作为这个类的成员变量,每个线程对共享数据的操作方法页封装在外部类,以便实现对数据的各个操作的同步和互斥,作为内部类的各个Runnable对象调用外部类的这些方法。...原创 2020-06-26 18:00:54 · 1246 阅读 · 0 评论 -
多线程join方法用于什么场景?
主线程创建并启动了子线程,如果子线程中需要进行大量的耗时运算,主线程往往将早于子线程结束之前结束。如果主线程想等待子线程执行完毕后,获得子线程中的处理完的某个数据,就要用到join方法。join方法的作用是等待线程对象被销毁。...原创 2020-06-26 18:00:00 · 413 阅读 · 0 评论 -
volatile适用于高并发的什么场景?
volidate最适合一个线程写,多个线程读的场景,如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来替代。我们只能在有限的一些场景下使用volidate变量来替代锁,要使volidate变量提供理想的线程安全,必须同时满足下面两个条件:对变量的写操作不依赖于当前值。该变量没有包含在具有其他变量的不变式中。...原创 2020-06-26 17:59:09 · 525 阅读 · 1 评论 -
ReentrantLock和Synchronized的区别?
相同点:两者都是可重入锁,他们的加锁方式都是同步,而且都是阻塞式的同步,也就是说当一个线程获得了对象锁,进入了同步块,其它访问概统不快的线程都必须阻塞在同步块外面等待。不同点:原始构成:Synchronized是Java语言的关键字,是原生层面的互斥,需要jvm实现;而ReentrantLock是JDK1.5之后提供的API层面的互斥锁类。实现:Synchronized是通过JVM来加锁和解锁;ReentrantLock是API层面的加锁和解锁。代码编写:Synchronied不需要用户去手动释原创 2020-06-26 17:58:15 · 378 阅读 · 1 评论 -
Java多线程中调用wait()和sleep()方法有什么不同?
相同点:他们都是在多线程的环境下,都可以在程序的调用出阻塞指定的毫秒数,并返回。二者都可以通过interrupt()方法打断现成的暂停状态,从而使线程立刻抛出InterruptedException。不同点:wait()属于Object类的方法,sleep()属于Thread类的方法。每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现现成的同步。sleep()方法没有释放锁,而wait()方法释放了锁,使得其他线程可以使用同步控制块或者方法。wait()原创 2020-06-26 17:57:14 · 3785 阅读 · 1 评论 -
Thread类中的start()和run()方法有什么区别?
通过start()方法来启动一个线程,此时线程处于就绪状态,可以被JVM来调度执行,在调度过程中,JVM通过调用线程类的run()方法来完成实际的业务逻辑,当run()方法结束后,此线程就会终止,所以通过start()方法可以达到多线程的目的。如果直接调用线程类的run()方法,会被当做一个普通的函数调用,程序中仍然只有主线程这一个线程,即start()方法呢能够异步的调用run()方法,但是直接调用run()方法确实同步的,无法达到多线程的目的。...原创 2020-06-26 17:56:08 · 2892 阅读 · 0 评论 -
Runnable和 Thread的区别?
Runnable和Thread本身并没有实质的区别,除此之外,主要有以下区别:Runnable的使用方式是实现其接口,Thread的使用方式是继承其类,二者都需要实现run方法。Runnable接口支持多继承,但基本上用不到。Thread实现了Runnable接口并进行了扩展,而Thread和Runnable的市值是实现的关系,不是同类的东西,所以Runnable和Thread本身并没有可比性。...原创 2020-06-26 17:54:49 · 3030 阅读 · 0 评论