Java多线程
琴剑山庄
这个作者很懒,什么都没留下…
展开
-
Thread的setDaemon(true)方法的作用
定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为守护线程的方式是在 线程对象创建 之前 用线程对象的setDaemon方法。example: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thr原创 2016-10-25 21:36:40 · 543 阅读 · 0 评论 -
java多线程(8)--ConcurrentHashMap使用
一.ConcurrentHashMap的简要总结:1、public V get(Object key)不涉及到锁,也就是说获得对象时没有使用锁;2、put、remove方法要使用锁,但并不一定有锁争用,原因在于ConcurrentHashMap将缓存的变量分到多个Segment,每个Segment上有一个锁,只要多个线程访问的不是一个Segment就没有锁争用,就没有堵塞,各线程用各自的锁原创 2017-03-21 22:15:15 · 1083 阅读 · 0 评论 -
java多线程(9)--同步类容器和并发类容器
一、同步类容器同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作。复合类操作如:迭代(反复访问元素,遍历完容器中的所有元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这些复合操作在多线程并发的修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationException,原因是当容器迭代的过程中,被并发的修改了内容,这是由于原创 2017-03-22 16:35:29 · 659 阅读 · 0 评论 -
java多线程(10)--并发类容器 CopyOnWriteArrayList 的使用
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。原创 2017-03-22 17:34:04 · 335 阅读 · 0 评论 -
java多线程(11)--ConcurrentLinkedQueue
基于链接节点的、无界的、线程安全。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列检索操作从队列头部获得元素。当许多线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许 null 元素。//高性能无阻塞无界队列:Conc原创 2017-03-22 18:20:04 · 379 阅读 · 0 评论 -
java多线程(12)--BlockingQueue深入分析
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个队列原创 2017-03-22 21:22:39 · 298 阅读 · 0 评论 -
java多线程(13)--线程同步工具之CountDownLatch
有时候会有这样的需求,多个线程同时工作,然后其中几个可以随意并发执行,但有一个线程需要等其他线程工作结束后,才能开始。举个例子,开启多个线程分块下载一个大文件,每个线程只下载固定的一截,最后由另外一个线程来拼接所有的分段,那么这时候我们可以考虑使用CountDownLatch来控制并发。 CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类原创 2017-03-22 21:39:02 · 322 阅读 · 0 评论 -
java多线程(14)--线程池作用及Executors方法讲解
线程池的作用: 线程池作用就是限制系统中执行线程的数量。 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开原创 2017-03-22 22:48:12 · 389 阅读 · 0 评论 -
java多线程(15)--线程池ThreadPoolExecutor使用
1. ThreadPoolExecutor的一个常用的构造方法ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler)参数说明:原创 2017-03-22 23:22:31 · 404 阅读 · 0 评论 -
Java并发编程:Callable和Future使用
Callable与Future 两功能是Java在后续版本中为了适应多并法才加入的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务。Callable的接口定义如下;public interface Callable { V call() throws Exception; }原创 2017-06-21 09:58:35 · 478 阅读 · 0 评论 -
java多线程(7)--多线程中sleep和wait的区别
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只原创 2017-02-10 11:09:52 · 276 阅读 · 0 评论 -
java多线程(6)--多线程的安全问题总结
1、多线程安全问题分析 多线程安全问题原因是在cpu执行多线程时,在执行的过程中可能随时切换到其他的线程上执行。 在以上红色选中的三个部分,线程都有可能进行切换。只要cpu在这个三个地中的任何地方切换了,都可能导致错误数据出现,线程的不安全因素就有了。 造成错误数据的原因是多个线程可能出现同时访问num的情况。而任何一个线程在访问num的过程中都可以切换到其他的线程原创 2017-02-08 22:41:46 · 3111 阅读 · 0 评论 -
多线程(2)-- yield( )
使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。Java线程中有一个Thread.yield( )方法,很多人翻译成线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程原创 2017-01-12 22:34:46 · 296 阅读 · 0 评论 -
【java并发】传统线程技术中的定时器技术
传统线程技术中有个定时器,定时器的类是Timer,我们使用定时器的目的就是给它安排任务,让它在指定的时间完成任务。所以先来看一下Timer类中的方法(主要看常用的TimerTask()方法):返回值方法名方法描述voidschedule(TimerTask task, long delay)安排在指定延迟后执行指定的任务。void原创 2016-10-25 22:36:15 · 378 阅读 · 0 评论 -
java 多线程等待、唤醒机制实例
例子:1、实体类public class Student { String name; int age; boolean flag = false; // 表示没有值}2、线程1public class SetThread implements Runnable { private Student s; private原创 2016-10-26 12:46:53 · 6724 阅读 · 0 评论 -
多线程中this.getName()和Thread.currentThread().getName()返回名字不一样的问题
public class hello extends Thread { public hello(){System.out.println("Thread.currentThread().getname()="+Thread.currentThread().getName());System.out.println("This.getName="+this.getName());原创 2016-10-27 21:49:09 · 915 阅读 · 0 评论 -
Thread.currentThread()、isAlive()、Thread.sleep()的使用
1、Thread.currentThread()方法: 返回当前正在运行的线程一个简单的例子: MyThread_7.Java类的构造函数是被main线程调用的,而run()方法是被名为Thread-0的线程调用的。注意这里使用thread.start(),而不是thread.run(),前者run()方法是自动调用的,后者并没有另起一个线程,而是直接调用MyT原创 2016-10-27 22:22:05 · 9244 阅读 · 0 评论 -
Thread类的interrupt,interrupted,isInterrupted方法的理解
在学校的论坛Java版发现很多问关于这样的问题,比如这几个方法有什么区别,想看t.interrupt()方法后线程的中断状态;如何终止一个线程其实之前已经大部分提及到。现总结一下,然后加上例子,毕竟例子容易理解http://www.blogjava.net/fhtdy2004/archive/2009/06/08/280728.html中有关interrupt()的解释已经很清楚了原创 2016-10-29 10:56:36 · 640 阅读 · 0 评论 -
java多线程(3)-- join( )
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join(); //使调用线程 t 在此之前执行完毕。t.join(1000); //等待 t 线程,等待时间是1000毫秒 总结一下:1.join方法的作用是阻塞主进程(原创 2017-02-07 22:20:29 · 274 阅读 · 0 评论 -
java多线程(4)-- volatile原理与技巧
volatile, 用更低的代价替代同步为什么 使用volatile比同步代价更低? 同步的代价, 主要由其覆盖范围决定, 如果可以降低同步的覆盖范围, 则可以大幅提升程序性能.而volatile的覆盖范围仅仅变量级别的. 因此它的同步代价很低.volatile原理是什么?volatile的语义, 其实是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我.(工作内存详见J原创 2017-02-07 22:21:47 · 258 阅读 · 0 评论 -
java多线程(5)--总结
一、理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。 多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果原创 2017-02-07 22:24:29 · 332 阅读 · 0 评论 -
多线程(1)-- isAlive()和Sleep()
1.含义isAlive()的功能是判断当前的线程是否处于活动状态2.代码例子(1)在不同的线程运行同一个方法package com.ray.deepintothread.ch01.topic_4; public class IsAliveSample_1 { public static void main(String[] args) {原创 2017-01-12 14:49:29 · 641 阅读 · 0 评论 -
java多线程(16)--线程控制之线程优先级
每个线程执行时都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较少的执行机会。每个线程默认的优先级都与创建它的父线程的优先级相同,在默认情况下,main线程具有普通优先级,由main线程创建的子线程也具有普通优先级。Thread类提供了setPriority(int newPriority)、getPriority()方法来设置和返回指定线程的优先级,其原创 2017-11-23 23:06:33 · 557 阅读 · 0 评论