package testthread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
* 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,
* 要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
*
* 使用condition接口、lock类、ReentrantLock类实现线程的通信
*
*/
public class TestLock {
public static void main(String[] args) {
final AlternateDemo ad = new AlternateDemo(); //在使用Java局部内部类或者匿名内部类时,若该类调用了所在方法的局部变量,则该局部变量必须使用final关键字来修饰,否则将会出现编译错误“Cannot refer to a non-final variable * inside an inner class defined in a different method”
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
ad.loopA();
}
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
ad.loopB();
}
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
ad.loopC();
System.out.println("-----------------------------------");
}
}
}, "C").start();
}
}
class AlternateDemo {
private int number = 1; //当前正在执行线程的标记
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
public void loopA() {
lock.lock();//类比去银行办理业务,此行代码相当于先拿到一个办理业务的排队号码
try {
//1. 判断
if (number != 1) {
condition1.await();//线程等待之后,该线程中的其它代码都不会被执行,就直接退出了
}
//2. 打印
System.out.println(Thread.currentThread().getName());
//3. 唤醒
number = 2;
condition2.signal();//尝试去唤醒一个其它等待的满足条件的线程,每个线程都会拿到一次锁,若条件满足将会执行该线程,否则将会等待
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void loopB() {
lock.lock();
try {
//1. 判断
if (number != 2) {
condition2.await();//等待之后将会释放锁
}
//2. 打印
System.out.println(Thread.currentThread().getName());
//3. 唤醒
number = 3;
condition3.signal();
//condition3.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void loopC() {
lock.lock();
try {
//1. 判断
if (number != 3) {
condition3.await();
}
//2. 打印
System.out.println(Thread.currentThread().getName());
//3. 唤醒
number = 1;
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
相关推荐
在Java中,可以通过继承`Thread`类或者实现`Runnable`接口来创建线程。 ##### 3. 多线程分页查询方案设计 针对数据量较大的场景,本文介绍的多线程分页查询方案主要包含以下几个步骤: - **步骤1:计算总记录数**...
本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与线程的基本概念。程序是一组静态指令的集合,而进程则是程序在执行过程中的一个实例,拥有独立的内存...
### Java多线程的使用与介绍 #### 什么是多线程? 多线程是指程序能够同时执行多个线程的能力。每个线程都是一个轻量级的进程,可以在单个程序中独立运行,共享该程序的资源。在Java中,多线程是通过`java.lang....
此外,Java中的java.util.concurrent.locks.Condition接口提供了条件变量的实现,可以用来控制线程之间的协作。 除了上述核心概念和工具类,Java 5.0引入了并发工具类如CountDownLatch、CyclicBarrier、Semaphore等...
在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程。`Thread`类提供了线程的启动、同步和控制方法,如`start()`、`join()`和`...
单线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 ...
《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...
下面将详细探讨Java多线程在弹球游戏中如何应用以及相关知识点。 首先,我们要理解Java中的线程。线程是程序执行的最小单位,一个进程可以有多个线程。在Java中,可以通过继承Thread类或实现Runnable接口来创建线程...
在本文中,我们将介绍如何使用Java实现两个线程同时运行的案例,涉及Java多线程相关操作与使用技巧。 Java多线程编程的优点包括: 1. 提高程序的执行效率:多线程编程可以将复杂的任务分解成多个小任务,每个任务...
在Java中,多线程的实现主要有两种方式:一种是继承Thread类,另一种是实现Runnable接口。然而,多线程的使用同时也引入了线程安全问题,需要程序员注意同步控制和数据一致性。 在讨论Java多线程技术时,首先需要...
在Java中,我们可以使用`java.net.URLConnection`类来获取文件的相关信息,如文件的总长度。通过`URLConnection.connect()`方法建立连接,然后调用`getContentLengthLong()`来获取文件的大小。这有助于确定文件需要...
Main方法是运行开始的方法,里面StopWatch是测速工具类,如果要想使用请导入相关maven坐标,不想使用直接删除即可。 内容概要: 这是随手写的一个利用线程池下载文件的小玩具,如果刚学完线程池不知道怎么使用的,...
Java提供了丰富的API,如`Thread`类、`Runnable`接口以及`ExecutorService`等,来支持多线程的创建和管理。本书将深入讲解这些核心概念,包括线程的生命周期、同步机制、线程池的使用,以及如何避免常见的并发问题,...
### Java多线程相关知识总结 #### 一、基本概念 多线程是现代编程语言中一项非常重要的特性,尤其在Java这样的高级语言中更是如此。简单来说,**多线程**指的是在一个程序中能够同时运行多个不同的执行路径。下面...
本文将深入探讨 Java 中的多线程相关知识,包括线程的创建、同步机制以及 `wait`、`notify` 和 `notifyAll` 方法的使用。 首先,线程的创建在 Java 中主要通过两种方式:一是继承 `Thread` 类,二是实现 `Runnable`...
- **线程同步**:为了解决多个线程对共享资源的并发访问问题,Java提供了`synchronized`关键字、`Lock`接口以及相关的工具类,如`ReentrantLock`。 2. **设计模式** - **生产者消费者模式**:使用`BlockingQueue`...
在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。下面将深入探讨这两个方法以及相关的知识点。 1. 继承Thread类 当一个类继承了Thread类,它就成为一个线程类。通过重写Thread类的`run()`...
内容概要:本文汇总了有关Java多线程方面的28个面试题目及其详细解答,涵盖了线程的基础概念、线程创建方法、线程控制(启动、同步、休眠、停止)、高级特性和应用技巧(线程局部存储、线程池、同步器等)。...
实现`Runnable`接口更为灵活,因为Java不支持多重继承,而一个类可以实现多个接口。 2. **线程的生命周期** 线程有五种状态:新建、就绪、运行、阻塞和死亡。Java的`Thread`类提供了控制线程的方法,如`start()`...
总之,这个"java多线程demo"项目提供了全面的多线程编程实践,涵盖了基础的线程创建、线程同步、线程池以及高级的并发工具类的使用。通过分析和运行这些示例,开发者可以深入理解和掌握Java的多线程特性,提升并发...