Java多线程
Java多线程知识
NeverGiveUpU
这个作者很懒,什么都没留下…
展开
-
Java多线程——Thread执行自己的run方法还是Runnable的run方法?
众所周知,Runnable的run方法可以交给Thread执行,如果Thread有自己的方法,那执行谁的run方法?从Thread类可以看到,当传入Runnable对象时,运行的是Runnable的run方法。...原创 2019-01-18 15:19:37 · 2241 阅读 · 0 评论 -
Java多线程——如何正确的停止线程
大体上有两种方法:标志法,异常法标志法class MyThread implements Runnable{ private volatile Boolean flag = true; public void run(){ while(flag){ //do something } } public v...原创 2019-01-18 15:00:32 · 192 阅读 · 0 评论 -
Java多线程——为什么弃用stop、suspend、resume方法
初始的Java版本定义了一个stop方法用来终止一个线程,以及一个suspend方法用来阻塞一个线程直至另一个线程调用resume。stop和suspend方法有一些共同点:都试图控制一个给定线程的行为。stop、suspend和resume方法已经弃用。stop方法天生就不安全,经验证明suspend方法会经常导致死锁。首先来看看stop方法,该方法终止所有未结束的方法,包括run方法。当...原创 2019-01-18 13:57:59 · 1064 阅读 · 1 评论 -
Java多线程——守护线程
在Java中有两种线程,一种是用户线程,另一种是守护线程。守护线程是一种特殊的线程,它的线程有“陪伴”的含义,当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程,当进程中没有非守护线程了,则垃圾回收线程也就没有存在的必要了,自动销毁。用个比较通俗的比喻来解释一下“守护线程”:任何一个守护线程都是整个JVM中所有非守护线程的“保姆”,只要当前JVM实例中存在任何一个非守...原创 2019-01-17 17:06:27 · 138 阅读 · 0 评论 -
Java多线程——阻塞队列
现在已经了解了形成Java并发程序设计基础的底层构件块。然而,对于实际编程来说,应该尽可能远离底层结构。使用由并发处理的专业人士实现的较高层次的结构要方便的多、安全的多。对于许多线程问题,可以通过使用一个或多个队列以优雅且安全的方式将其形式化。生产者线程向队列插入元素,消费者线程则取出它们。使用队列,可以安全的从一个线程向另一个线程传递数据。例如,考虑银行转账程序,转账线程将转账指令对象插入一个...原创 2019-01-11 15:25:56 · 203 阅读 · 0 评论 -
Java多线程——join() 指定线程插队运行
在Java语言中,join()方法的作用是让调用该方法的线程在执行完run()方法后,再执行join方法后面的代码。简单的说,就是将两个线程合并,用于实现同步功能。具体而言,可以通过线程A的join()方法来等待线程A的结束,或者使用线程A的join(2000)方法来等待线程A的结束,但最多只等待2s。我的理解:threadA.join()相当于threadA插队运行。试想这样的场景:有A、B...原创 2019-01-11 15:21:42 · 647 阅读 · 0 评论 -
Java多线程——局部变量
线程间有时要避免共享变量,使用ThreadLocal辅助类为各个线程提供各自的实例。例如,SimpleDateFormat类不是线程安全的。public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");如果两个线程都执行以下操作:String dateStamp = dateFo...原创 2019-01-10 23:52:04 · 635 阅读 · 0 评论 -
Java多线程——通过管道进行线程间通信
管道流在Java语言中提供了各种各样的输入/输出流Stream,使我们能够很方便的对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。在Java的JDK中提供了4个类来使线程间可以进行通信:1) PipedInputStr...原创 2019-01-10 16:38:23 · 269 阅读 · 0 评论 -
Java多线程——wait(),notify()(等待通知机制)
需要说明的是,多个线程之间通过共同访问同一个变量也可以实现通信,但那种通信机制不是“等待/通知”,两个线程完全是主动式的读取一个共享变量,在花费读取时间的基础上,读到的值是不是想要的,并不能完全确定。所以现在迫切需要一种“等待/通知”机制来满足上面的需求。wait()与nonify()方法wait()的作用是使当前执行代码的线程进行等待,wait()方法是Object类的方法,该方法用来将当前...原创 2019-01-10 16:30:39 · 466 阅读 · 0 评论 -
Java多线程——volatile关键字
volatile关键字关键字volatile的主要作用是修饰变量,每次使用强制从内存中取最新值。在Java语言编写的程序中,有时为了提高程序的运行效率,编译器会自动对其进行优化,把经常被访问的变量缓存起来,程序在读取这个变量时有可能会直接从缓存(例如寄存器)中来读取这个值,而不会从内存中读取。这样做的一个好处是提高了程序的运行效率,但当遇到多线程编程时,变量的值可能因为别的线程而改变了,而缓存...原创 2019-01-10 15:17:27 · 133 阅读 · 0 评论 -
Java多线程——synchronized
什么是线程安全?“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是取到的数据其实是被更改过的。而“线程安全”就是已获得的实例变量的值是经过同步处理的,不会出现脏读的现象。非线程变量”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了。两个线程同时访问一个没有同步的方法,如果两个线...原创 2019-01-10 00:09:36 · 151 阅读 · 0 评论 -
Java多线程——Callable和Future
Callable类Runnable封装一个异步运行的任务,可以把它想象成为一个没有参数和返回值的异步方法。Callable与Runnable类似,但是有返回值。Callable接口是一个参数化的类型,只有一个方法call。public interface Callable<E>{ E call() throws Exception;}类型参数是返回值的类型。例如,Ca...原创 2019-01-09 21:08:55 · 192 阅读 · 0 评论 -
Java多线程——线程池
Executor类(产生线程池)构建一个新的线程是有一定代价的,因为涉及与操作系统的交互。如果程序中创建了大量的生命期很短的线程,应该使用线程池(thread pool)。一个线程池中包含许多准备运行的空闲线程。将Runnable对象交给线程池,就会有一个线程调用run方法。当run方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务。另一个使用线程池的理由是减少并发线程的数目。创建大...原创 2019-01-09 20:53:03 · 163 阅读 · 0 评论