多线程技术
名侦探张六儿
学习学习学习
展开
-
【Java多线程】对象及变量的并发访问——synchronized关键字(二)
上一篇文章主要讲解了synchronized关键字的作用和在各种情况下的各种用法,本篇将对于并发访问对象的相关知识进行一些补充。一、String的常量池特性 在JVM中String具有常量池的缓存功能,比如 String a = "abc"; String b = "abc"; System.out.println(a==b); 此程序...原创 2018-05-10 11:26:08 · 148 阅读 · 0 评论 -
线程调度中sleep(),wait(),yield()的区别
1、sleep()方法会给其他线程运行的机会,而不考虑其他线程的优先级,因此会给较低线程一个运行的机会;yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。 2、当线程执行了sleep(long millis)方法后,将转到阻塞状态,参数millis指定睡眠时间;当线程执行了yield()方法后,将转到就绪状态。 3、sleep()方法声明抛出InterruptedExce...转载 2018-03-22 14:26:00 · 423 阅读 · 0 评论 -
【Java多线程】——多线程知识补充
一、线程的状态前面的文章中已经研究过线程从创建到销毁这之间的各种状态以及各种状态之间切换的条件,但是都比较零碎。这里将这部分知识用一张系统的关系图来表示。从图中可以看出,调用相关的一些方法后线程会在几个状态之间切换,这些状态之间有些可以双向切换,比如waiting和runnable状态之间可以循环的互相切换(通过等待/通知机制),而有些状态之间只能单向切换。下面对各种状态进行一个简单的总结。NEW...原创 2018-05-30 15:41:05 · 467 阅读 · 2 评论 -
【Java多线程】——定时器Timer的使用
在JDK中Timer类主要用于负责计划任务,也就是说在某个时间点开始执行一个计划好的任务。 Timer类中的方法列表如下: serialNumber() Timer():默认构造方法; Timer(boolean):参数表示thread是否为守护线程 Timer(String):参数为线程名 Timer(String, boolean) sched...原创 2018-05-24 15:26:55 · 1330 阅读 · 0 评论 -
【Java多线程】——单例模式与多线程
在常用的23种设计模式中,单例模式是很常用的一种。但是当单例模式与上多线程的时候,如果没有注意特殊情况,可能会产生一些意想不到的异常,有可能会导致灾难性的后果。下面我们就来研究一下单例模式再多线程环境下的应用。首先先简单的介绍一下单例模式。一、“饿汉模式”和“懒汉模式” 1、饿汉模式 首先,单例模式简单的说就是一个类在整个程序的运行过程中只创建唯一的一个实例化对象。所有有关这个...原创 2018-05-27 16:26:56 · 314 阅读 · 0 评论 -
【Java多线程】——join()方法
在一些情况下,主线程创建了子线程并启动,主线程和子线程异步执行。但是主线程可能会需要子线程的一些结果来执行接下来的任务,这时就需要等待自线程先执行完再继续执行主线程。我们可能会想到使用同步(synchronized)的方法,使主线程和子线程共同竞争一个对象锁,这样就可以达到依次同步执行的目的了。这个方法虽然可行,但是看上去可能麻烦了一些,这里就引入了一个概念叫做join()方法。一、join(...原创 2018-05-17 21:31:36 · 223 阅读 · 3 评论 -
【Java多线程】——通过管道进行线程间通信
在Java中提供了各种各样的输入输出流stream,我们可以用他们对数据进行方便的操作。其中,管道(pipeStream)是一种特殊的流,它可以用于在不同的线程之间传送数据。一个线程将数据输出到管道中,另一个线程从管道中读取需要的数据,实现不同线程之间的通信而无需通过临时文件。管道通信可以达到解耦的目的,产生数据的线程不需要直接调用处理数据的方法并等待返回结果,只需要将数据放入管道,接着继...原创 2018-05-16 14:19:16 · 1045 阅读 · 0 评论 -
【Java多线程】——Lock的应用
在java多线程编程中,很多时候我们会使用synchronized关键字来实现线程之间的同步执行,并通过wait/notify机制实现线程之间的通信。JDK1.5中增加了ReentrantLock类也可以实现synchronized关键字相同的效果,并且使用Condition类可以实现类似于wait/notify一样的线程之间的通信。一、使用ReentrantLock实现同步效果 在...原创 2018-05-21 16:23:14 · 473 阅读 · 0 评论 -
【Java多线程】——线程间通信(二)
上一篇主要介绍了线程间通信的基本方式——等待/通知机制,并且详细分析了wait()和notify()方法、线程对象的几种状态以及线程在这几种状态之间切换的条件。本篇主要介绍使用等待/通知机制实现生产者/消费者模式的几种形式,以及其他的一些实际运用。一、生产者/消费者模式 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能...原创 2018-05-14 16:22:32 · 103 阅读 · 0 评论 -
【Java多线程】——线程间通信(一)
进行多线程编程时,每个线程都是操作系统中的独立个体,但线程在执行任务的时候并不是只关注于完成自己的那一部分任务,很多时候需要与其他线程协作或者通过和其他线程的通信完成相应的任务。这个时候我们便要引入线程间通信的这个概念了。而在多线程编程中最常用到的线程间通信方法就是等待/通知机制了。在介绍等待/通知机制之前,我们先来看一个最简单的线程间通信的方式。一、不使用等待/通知 我们可...原创 2018-05-12 19:07:29 · 211 阅读 · 0 评论 -
【Java多线程】——ThreadLocal类的用法
变量值的共享可以通过使用public static的形式,使得一个类的所有实例对象共享类中的同一个变量。但是如果想要实现每个线程都有自己的一个共享变量该如何解决呢?这个时候就要用到ThreadLocal类了。ThreadLocal类就是用来解决每个线程都能绑定自己的值,可以把ThreadLocal类看成一个全局的存放数据的盒子,盒子中可以存放每个线程自己的数据。一、使用ThreadLoca...原创 2018-05-18 16:15:37 · 367 阅读 · 0 评论 -
【Java多线程】——暂停线程与线程优先级
1、暂停线程暂停线程意味着此线程还可以恢复运行,java中用suspend()暂停线程,用resume()恢复线程的运行。suspend与resume有一个共同的缺点——独占。在使用这两个方法的时候,如果使用不当,极易造成对公共的同步对象的独占,使得其他线程无法访问公共的同步对象。比如一个线程调用了一个同步方法或者是操作了一个同步代码块指定的同步对象,而在同步方法调用完毕之前调用了suspend(...原创 2018-05-04 19:28:02 · 223 阅读 · 0 评论 -
【Java多线程】——停止线程
停止线程是在进行多线程开发中的重要的知识点,停止线程并不像break那样简单干脆,需要一些技巧性的处理。本文将讨论如何在一个线程进行的过程中将其停止,停止一个线程意味着在当前线程执行完任务之前停止该线程,也就是放弃该线程正在进行的任务。虽然这看起来很简单,但是要做好防范工作,以避免可能会发生的错误。如果停止一个线程可以用Thread.stop()方法,但是不建议使用,虽然它可以停止一个线程,但是他...原创 2018-05-04 15:45:02 · 237 阅读 · 0 评论 -
【转载】volatile关键字详解
本文转自http://www.importnew.com/18126.htmlvolatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与...转载 2018-05-11 00:39:44 · 121 阅读 · 0 评论 -
【Java多线程】——volatile关键字
首先我们来看一个死循环的问题:public class RunThread extends Thread{ private boolean isRunning = true; public boolean isRunning() { return isRunning; } public void setRunning(boolean isRunning) { ...原创 2018-05-11 00:05:22 · 146 阅读 · 0 评论 -
【Java多线程】对象及变量的并发访问——synchronized关键字(一)
多线程编程中,一定会经常接触到一个概念,那就是“线程安全”。而线程安全是多线程编程所要关注的重要问题,而“非线程安全”的一个主要表现就是“脏读”,比如一个线程改变了对象内的变量值,但还没有执行完所有操作,这是另一个线程开始执行并取出了被改变过的这个变量,这时取出的数据就就称为“脏数据”。而Java中提供了一些并发访问的的方式,本文主要研究了其中的synchronized关键字的用法。一...原创 2018-05-09 19:58:29 · 183 阅读 · 0 评论 -
【Java多线程】——线程池的使用详解(含源码分析)
在开发中,我们常常会通过使用线程来完成一些需要并发执行的子任务,但是如果这些并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么怎样才能使得一个线程在执行完任务之后不被销毁,继续执行下一个任务,从而实现线程的复用呢?在Java中我们可以通过线程池来达到这样的效果。一、为什么要使用线程池...原创 2018-08-09 16:33:17 · 257 阅读 · 0 评论