java 两个线程
简介
使用synchronized, 来实现两个线程的同步操作.
参考链接
https://www.cnblogs.com/leihuazhe/p/7898563.html
TIPS
唤醒一个在等待资源的线程.
public final native void notify();
阻塞资源, 等待被唤醒.
public final void wait() throws InterruptedException {
wait(0);
}
Synchronized 锁的对象是方法的调用者, 两个方法用的是同一个锁, 谁先拿到谁先执行
code
/**
* Created by lee on 2021/6/21.
*/
public class Add {
public synchronized void one() throws InterruptedException {
boolean flag = true;
while(flag) {
for(int i = 1; i<=99; i+=2) {
System.out.println(Thread.currentThread().getName()+ " i " + i);
if(i == 99) {
flag = false;
this.notify();
break;
}
this.notify();
this.wait();
}
}
}
public synchronized void two() throws InterruptedException {
boolean flag = true;
while(flag) {
for(int i = 2; i<=100; i+=2) {
System.out.println(Thread.currentThread().getName()+ " i " + i);
if(i == 100) {
flag = false;
this.notify();
break;
}
this.notify();
this.wait();
}
}
}
public static void main(String[] args) {
Add a = new Add();
new Thread(()->{
try {
a.one();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
new Thread(()->{
try {
a.two();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"B").start();
}
}
结果
B i 98
A i 99
B i 100
java 两个线程的更多相关文章
- Java两个线程实现交替运行-以交替打印奇偶数为例
本文旨在两个线程交替运行,不多哔哔直接看代码吧 public class Work2 { static final Object object = new Object(); public stati ...
- Java值创建线程的两种方式对比
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...
- 使用Java线程并发库实现两个线程交替打印的线程题
背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...
- Java并发 两个线程交替执行和死锁
今天看到一个题:两个线程交替打印奇数和偶数,即一个线程打印奇数,另一个打印偶数,交替打印从1到100.想了下有多重实现方法. wait和notify方法: public class OddEven { ...
- java的两种线程
java中的两种线程 守护线程与用户线程 守护线程:就是服务于用户线程的线程,例如垃圾回收的线程及时最典型的守护线程.不需要上层逻辑的介入 用户线程:就是程序自己创建的线程 守护线程; 守护线 ...
- Java实现卖票程序(两种线程实现)
/** * 2019年8月8日16:05:05 * 目的:实现火车站卖票系统(第一种创建线程的方式) * @author 张涛 * */ //第一种方式直接继承Thread来创建线程 class T1 ...
- [Java并发]实现两个线程交替打印奇偶数(volatile+yield实现)
解题思路 实现一个类OddEven 有一个打印奇数的方法,有一个打印偶数的方法. 类中有一个volatile变量 ,用来控制当前状态是该哪个方法打印. 方法中打印每个数前首先判断volatile变量的 ...
- Java多线程 3 线程同步
在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...
- java 多线程 4 线程池
系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...
- 小谈Java里的线程
今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...
随机推荐
- Redis的底层数据结构-跳表
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的.具有如下性质: 1.由很多层结构组成: 2.每一层都是一个有序的链表,排列顺序为 ...
- AUTOFAC学习DEMO2-——ContainerBuilder注册三种方式、反射注册
注册组件 通过容器构造器ContainerBuilder注册组件的三种方式: 通过类型反射注册 通过现存实例注册(实现对象的实例) lambda表达式注册(通过可实例化对象的匿名函数注册) 每个组件可 ...
- ArcGIS Desktop 10.7 完美汉化安装教程
1,下载文件并解压缩,双击[Esri ArcGIS Desktop v10.7.0.exe] 2.在安装向导中选择[Next] 3.选中[I accept the master agreement]我 ...
- Java线程控制: sleep、yield、join深度解析
结论先行 sleep:主动让出CPU但保持锁,适合控制执行节奏和优化CPU占用 yield:建议让出CPU但无强制力,适用场景有限且效果不稳定 join:通过等待机制实现线程顺序控制,底层基于wait ...
- Java--利用打印流(PrintStream)输出信息
package demo; import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; /** ...
- API接口调用--历史上的今天(v1.0)
历史上的今天 参考(聚合数据):https://www.juhe.cn/docs/api/id/63 事件列表(v1.0) 接口地址: http://api.juheapi.com/japi/toh ...
- Linux系列:聊一聊 SystemV 下的进程间共享内存
一:背景 1. 讲故事 昨天在分析一个 linux 的 dump 时,看到了这么一话警告,参考如下: 0:000> !eeheap -gc *** WARNING: Unable to veri ...
- 告别源码阅读困境!五款 AI 工具强势救场
一.简介 阅读项目源码困难重重,复杂的代码结构.繁多的依赖关系,常常让开发者们焦头烂额.别慌!这里有五款AI工具,堪称源码阅读神器,能帮你轻松搞定这些难题,快速理解项目核心,提升开发效率. 文章首发公 ...
- RPC实战与核心原理之分布式环境下如何快速定位问题
分布式环境下如何快速定位 回顾 如何建立可靠的安全体系,关键点就是"鉴权",我们可以通过统一的鉴权服务动态生成秘钥,提高 RPC 调用的安全性. 分布式环境下定位问题有哪些困难 举 ...
- Python标准库学习之logging
前言 在python程序中,出于调试监测或者追踪(track)的目的,一般会在关键的部位加print语句来输出监测的变量值,但对于复杂的程序来讲,这样的调试手段就远远不够了,这也是logging库存在 ...