
Java多线程
文章平均质量分 70
多线程理论+实战,纯干货!
罗汉爷
每一个不曾起舞的日子,都是对生命的辜负!
展开
-
Java线程间协作之等待与通知:wait、notify和notifyAll
在 Java 多线程编程中,wait、notify 和 notifyAll 是用于线程间通信的重要方法。它们是在 Object 类中定义的,因此每个 Java 对象都可以使用这些方法。本文将通过一个实际应用场景来介绍它们的使用。原创 2024-10-11 13:06:28 · 358 阅读 · 0 评论 -
Java并发编程实例--7.守护(Damon)线程
Java有一种特殊线程叫守护(后台)线程。1.这类线程拥有非常低的优先级且通常只是在没有其他线程运行的情况下执行。2.其通常作为无线循环服务去执行某项任务。3.不能让他们去执行重要任务因为你不知道他们什么时候获得CPU时间或者何时运行结束。4.一个很典型的案例就是Java的垃圾收集器。本例中,我们将学习如何去差U你感觉一个守护线程。为此,我们会开发2个线程;一个用来往队列中写入事件,另一个也就是守...原创 2018-04-27 23:14:40 · 724 阅读 · 0 评论 -
Java并发编程实例--16.使用ReentrantLock实现线程同步
Java提供另一机制去同步代码块。它比synchronized关键字更强大且易用。它是基于Lock接口和其实现类例如:ReentrantLock。这一机制对比synchronized关键字的优势在于:1.可以构建更加灵活的同步代码块;2.Lock接口提供了一些额外功能,例如tryLock()方法,它会返回一个布尔值以表示当前资源是否被锁。3.Lock接口可以实现读写分离,多个...原创 2018-05-12 23:58:25 · 458 阅读 · 0 评论 -
Java并发编程实例--13.方法同步(synchronized)
使用synchronized关键字去控制对某个方法的并发调用。某一时段内,只能有一个线程可以读取该方法。其他线程需要等待前面线程调用完毕后方可调用。不过,静态方法有着不同的行为。虽然也是每次只能有一个线程调用它,但是另一个线程可以调用该类对象的其他非静态方法。这一点需要注意,因为如果2个线程可读取2个不同的同步方法,一个是静态另一个不是。如果这2个方法修改的是同样的数据,可能会导致数据不一致错误。...原创 2018-05-06 18:21:20 · 303 阅读 · 0 评论 -
Java并发编程实例--20.使用Semaphores(信号量)控制资源的并发读取
前面我们介绍了2种同步机制:1)使用synchronized关键字2)使用Lock接口及其实现类:ReentrantLock,ReentrantReadWriteLock.ReadLock, and ReentrantReadWriteLock.WriteLock本例中,我们将学习更高级的同步方式:semaphore (信号量)先看下概念:Semaphores: A semaphore is a ...原创 2018-05-19 17:12:29 · 660 阅读 · 0 评论 -
Java并发编程实例--17.使用read/write锁同步数据访问
锁机制带来的最有意义的改进是提供了ReadWriteLock接口及其实现类ReentrantReadWriteLock。这个类有2个锁,一个针对读操作另一个针对写操作。可以有多个线程使用读操作,但是只有一个线程使用写操作。当一个线程做写操作时,不能有任何线程做读操作。本例中,我们将学习如何通过ReadWriteLock接口实现一个对2个产品价格的访问进行控制。PricesInfo.javapack...原创 2018-05-13 23:22:49 · 315 阅读 · 0 评论 -
Java并发编程实例--8.在线程中处理未检查异常
java中有两类异常:已检查异常:这类异常编译器要求开发者必须在代码中通过throws去处理。例如:IOException和ClassNotFoundException。未检查异常:不必显式的在代码重处理。例如:NumberFormatException。所有派生自Error和RuntimeException的类,都是未检查异常.其余的是已检查异常.当一个已检查异常在线程对象的run()方法中抛出...原创 2018-04-30 00:17:16 · 365 阅读 · 0 评论 -
Java并发编程实例--18.修改锁的公平性
ReentrantLock和ReentrantReadWriteLock类的构造函数可接受一个布尔类型参数fair,表示你可以控制这2个类的行为。其默认值为false,代表non-fair(不公平)模式。这种模式下,如果有多个线程等待获得锁并且只能有一个线程获得,上面2个锁类会无条件选择一个。(也就是随机抽一个)值为true的话就表示fair模式,即公平模式。意思是有个先来后到,就跟咱们买东西要排...原创 2018-05-15 00:21:58 · 306 阅读 · 0 评论 -
Java并发编程实例--19.在一个锁中使用多个条件
一个锁可能关联了一个或多个条件。这些条件可以在Condition接口中声名。使用这些条件的目的是去控制一个锁并且可以检查一个条件是true或false,如果为false,则暂停直到另一个线程来唤醒它。Condition接口提供了这样一个机制 去暂定一个线程和唤醒一个暂停中的线程。本例中继续拿生产者-消费者问题举例。FileMock.javapackage com.dylan.thread.ch2....原创 2018-05-15 23:27:23 · 426 阅读 · 0 评论 -
Java并发编程实例--6.线程的join方法
有时我们需要等到某个线程执行完毕。例如,我可能有一个线程来初始化资源完毕然后其他线程才能开始执行。谓词,我们可以使用Thread类的join()方法。本例中,我们将学习使用这个方法。DataSourcesLoader.javapackage com.dylan.thread.ch1.c06;import java.util.Date;import java.util.concurrent.T...原创 2018-04-25 23:13:32 · 295 阅读 · 0 评论 -
Java并发编程实例--15.在同步代码块中使用条件
并发编程中有个经典问题:生产消费者问题。我们有一个数据缓冲区,一个或多个生产者往其中存入对象,另外一个或多个消费者从中取走。因此,该数据缓冲区是一个共享数据结构,我们需要对其添加读取同步机制,但是我们还需要一些限制。如果缓冲区满了,生产者不能继续向其中写入;反过来如果缓冲区空了,消费者也不能继续读取。对于这种情况,Java提供了wait(),notify()和notifyAll()方法。一个线程可...原创 2018-05-11 22:31:50 · 376 阅读 · 0 评论 -
Java并发编程实例--12.使用线程工厂创建线程
工厂模式是面向对象编程世界中最有用的设计模式。它是一个创新型的模式,目标是开发一个对象,这个对象的任务是去创建其他类对象。这样一来,如果我们想创建某些类的对象就不需要使用new关键字。好处有以下几点:1.容易改变对象的类或者创建这些对象的方式;2.容易限制所创建的对象。例如,我们只能创建N个某类型的对象;3.容易生成对象创建的统计数据;Java并发API提供了ThreadFactory接口以实现一...原创 2018-05-05 16:36:09 · 901 阅读 · 0 评论 -
Java并发编程实例--4.控制线程打断
Java提供了InterruptedException异常,当我们检测到线程被打断时可以抛出并在run()方法中进行捕捉。本例中,我们将开发一个程序以实现根据文件名称在指定文件夹(包括其子目录)中搜索它。以此来介绍如何使用InterruptedException异常。FileSearch.java package com.dylan.thread.ch1.c04;import java....原创 2018-04-23 22:25:35 · 738 阅读 · 0 评论 -
Java并发编程实例--3.打断一个线程
一般来讲一个java程序如果运行着多个线程,那么只有在这些线程都运行完毕后才会终止。但有时候,我们需要去结束某个线程或者取消某个任务。此时就用到了Java线程的打断机制,即interruption。本例中,我们将开发一个程序创建线程,5秒后将强制打断它。PrimeGenerator.javapackage com.dylan.thread.ch1.c03;/** * @author xusu...原创 2018-04-22 23:55:38 · 638 阅读 · 0 评论 -
Java并发编程实例--1.创建和运行一个线程
从这一篇开始写Java并发编程实例,内容都翻译整理自书籍:《Java 7 Concurrency Cookbook》谈到线程,无法逃避的一个问题就是:并发(concurrency)和并行(parallellism)区别:解释一:并发是指两个或多个事件在同一时间间隔发生;并行是指两个或者多个事件在同一时刻发生;解释二:并发是多个任务在一台处理器上“同时”处理;并行是在多台处理器(或多核心CPU)上同...原创 2018-04-21 00:05:08 · 571 阅读 · 0 评论 -
Java并发编程实例--2.获取和设置线程信息
常用线程属性ID: 每个线程的唯一标识;Name: 线程名称;Priority: 线程优先级,从1-10,数字越大优先级越高;不推荐改变线程优先级;Status: 线程状态,包含6种状态:new, runnable, blocked, waiting, time waiting, terminated本例中,我们会开发一个程序以设置线程名称和优先级并展示一些线程信息。Calculator.java...原创 2018-04-21 22:54:19 · 266 阅读 · 0 评论 -
Java并发编程实例--9.使用本地线程变量
并发程序一个重要方面就是共享数据。这一点在继承了Thread类或实现了Runnable接口的对象中有着特殊的重要性。如果你创建了一个实现了Runnable接口的类对象并且用这个对象开启了N个线程对象,那么所有这些线程对象共享同样的属性。这意味着,如果你再某一线程中修改了属性值,所有其他线程将都能看到并受影响。有时候,你可能对每个线程拥有自己私有的属性感兴趣。这也正是Java并发API提供的一项机制...原创 2018-04-30 20:18:40 · 382 阅读 · 0 评论 -
Java并发编程实例--10.使用线程组
并发API提供的一个有趣功能是可以将多个线程组成一个组。这样我们就能将这一组线程看做一个单元并且提供改组内线程对象的读取操作。例如你有一些线程在执行同样的任务并且你想控制他们,不考虑有多少个线程仍在运行,一个打断动作将会打断所有组内线程的执行。Java提供了一个ThreadGroup类来表示一组线程。一个线程组对象由多个线程对象和另一个线程组对象组成,从而形成树状的线程结构。本例中,我们将学习使用...原创 2018-05-02 23:41:18 · 388 阅读 · 0 评论 -
Java并发编程实例--14.在一个同步类中安排独立属性
当你使用synchronized关键字去保护一个代码块时,你必须传入一个对象的引用。正常来讲,你讲使用this关键字去引用执行这个方法的对象,但是你可以使用其他对象的引用。通常的,这些对象将会是专有的。例如,如果多个线程共享一个类中有2个独立的属性,你必须对每个变量做读取同步操作,但是如果一个线程读取一个属性而另一个线程读取另一个这个没问题的。本例中,你讲学会如何解决这个问题。我们将模拟带有2块屏...原创 2018-05-11 00:22:25 · 444 阅读 · 0 评论 -
Java并发编程实例--11.在线程组中处理未检查异常
第8个例子讲了如何在线程中捕捉未检查异常,本例将介绍如何在线程组中处理未检查异常。Task.javapackage com.dylan.thread.ch1.c11.task;import java.util.Random;/** * Class that implements the concurrent task * */public class Task implements...原创 2018-05-05 15:55:06 · 346 阅读 · 0 评论 -
Java并发编程实例--5.线程睡眠
有时候我们需要让线程在一段时间内不做任何事。例如某线程每个一小时检测一下传感器,剩余的时间不做任何事。我们可以使用sleep()方法使线程睡眠,此期间不占用计算机资源。这个方法接受一个整数表示睡眠的毫秒数。睡眠结束后,JVM将从新分配其CPU时间。另一种睡眠方式是使用TimeUnit枚举元素的sleep()方法。本例中,我们将开发一个程序,使用sleep()方法,实现每秒钟输出系统时间。FileC...原创 2018-04-24 23:29:40 · 487 阅读 · 0 评论