- 浏览: 2610953 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (880)
- 每日总结 (26)
- java (37)
- lucene 2.4源码学习 (11)
- 庖丁分词的源码分析 (5)
- cindy源码阅读 (10)
- jetty (3)
- java基础 (49)
- hadoop (37)
- python (7)
- 那些蛋疼的事 (15)
- 测试 (5)
- spring (3)
- redis (4)
- git (4)
- 我的开源项目 (2)
- linux (15)
- mysql (8)
- bootsharp (1)
- idea (1)
- Disruptor源码分析 (11)
- 高并发 (22)
- jdk (4)
- 领域驱动 (1)
- 坑 (6)
- 表达式框架 (7)
- 游戏 (3)
- Guava (1)
- 缓存 (1)
- 数据库 (1)
- 游戏项目 (3)
- java8 (1)
最新评论
-
hsluoyz:
PyCasbin是一个用Python语言打造的轻量级开源访问控 ...
权限管理的一个简单后台 -
liuyachao111:
谢谢 问题解决了
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
jnjeC:
多谢博主分享,在配置文件里的&也要改成& ...
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
大维啊:
同志,你这不行啊!
java 的 AccessController.doPrivileged使用 -
lisha2009:
解决了我的问题,多谢博主分享!
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾
两个线程,分别打印[1,3,5]和[2,4,6],写一个程序,打印[1,2,3,4,5,6]。
方案1 用synchronized 配合wait notify
方案2 用ReentrantLock配合condition
方案3 对线程数据取余,直接调用线程的run方法
方案1不能实现超过2个线程的要求,因为notify是不能保证唤醒哪个线程
下面分别是3种实现的代码
方案1 用synchronized 配合wait notify
方案2 用ReentrantLock配合condition
方案3 对线程数据取余,直接调用线程的run方法
方案1不能实现超过2个线程的要求,因为notify是不能保证唤醒哪个线程
下面分别是3种实现的代码
package com.eyu.ahxy.module.common.config; import java.util.concurrent.TimeUnit; import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest1.*; public class OneTwoOneTwoTest1 { static int NUM = 0; static int MAX = 6; static Object LOCK = new Object(); public static void main(String[] args) throws InterruptedException { Thread thread1 = new ThreadTest1(); thread1.start(); Thread thread2 = new ThreadTest1(); thread2.start(); TimeUnit.SECONDS.sleep(1); synchronized (LOCK) { LOCK.notify(); } thread1.join(); thread2.join(); } } class ThreadTest1 extends Thread { public void run() { while (true) { synchronized (LOCK) { try { LOCK.wait(); } catch (InterruptedException e) { e.printStackTrace(); } NUM = NUM + 1; System.err.println(NUM + " ====" + Thread.currentThread()); if (NUM >= MAX) { break; } LOCK.notify(); } } }; }
package com.eyu.ahxy.module.common.config; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest2.*; public class OneTwoOneTwoTest2 { static int NUM = 0; static int MAX = 6; static ReentrantLock LOCK = new ReentrantLock(); static Condition thread1Ready = LOCK.newCondition(); static Condition thread2Ready = LOCK.newCondition(); public static void main(String[] args) throws InterruptedException { Thread thread1 = new ThreadTest2(thread1Ready, thread2Ready); thread1.start(); Thread thread2 = new ThreadTest2(thread2Ready, thread1Ready); thread2.start(); TimeUnit.SECONDS.sleep(1); LOCK.lock(); thread1Ready.signal(); LOCK.unlock(); thread1.join(); thread2.join(); } } class ThreadTest2 extends Thread { Condition self; Condition next; ThreadTest2(Condition self, Condition next) { this.self = self; this.next = next; } public void run() { while (true) { try { LOCK.lock(); self.await(); NUM = NUM + 1; System.err.println(NUM + " ====" + Thread.currentThread()); if (NUM >= MAX) { break; } next.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { LOCK.unlock(); } } }; }
package com.eyu.ahxy.module.common.config; import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest3.NUM; import java.util.ArrayList; import java.util.List; public class OneTwoOneTwoTest3 { static int NUM = 0; static int MAX = 6; static int THREAD_NUM = 2; public static void main(String[] args) throws InterruptedException { List<Thread> list = new ArrayList<>(); for (int i = 0; i < THREAD_NUM; i++) { list.add(new ThreadTest3()); } for (int i = 0; i < MAX; i++) { int num = i % THREAD_NUM; list.get(num).run();; } } } class ThreadTest3 extends Thread { public void run() { NUM = NUM + 1; System.err.println(NUM + " ====" + Thread.currentThread()); }; }
发表评论
-
Quartz 1.8.0版本的死锁问题
2017-01-05 15:04 5959先说问题的结论:https:/ ... -
Calendar.getInstance()的坑
2016-12-06 16:50 6002Calendar.getInstance()看起来应该是个单例 ... -
java线程池自己掉进去的坑
2016-08-18 17:59 2140java线程池的maximumPoolSize的生效条件真的是 ... -
java比AtomicLong 更高效的LongAdder
2016-04-14 21:05 3230AtomicLong 是通过cas来实现的,已经很高效了,还有 ... -
java避免缓存伪共享
2016-04-14 20:15 953java8之前的做法: 加6个无用的long字段 如: ... -
java重复批次执行
2015-04-21 20:39 1501方案1 使用Phaser 方案2 使用CyclicBarr ... -
mina实现相同session后到的请求一定后处理的原理
2015-03-26 22:04 3752mina后面的业务处理是一个线程池去处理的,在线程池的多线程的 ... -
简单实现一个java公平策略的锁
2015-03-24 21:40 1415代码是: package com.eyu.gift.loc ... -
对java的BitSet的多线程并发的探索
2015-03-23 14:45 4230java的BitSet不是线程安全的,所以多线程的时候h要加锁 ... -
java的Condition 加强版的wait notify
2015-01-29 20:26 5275Lock对应Synchronized,使用之前都要先获取锁 ... -
java用cyclicBarrier来实现Phaser的分段功能
2015-01-26 10:22 1602cyclicBarrier是有自动重置功能的,我们可以用这个功 ... -
java的Phaser,多线程分阶段执行
2015-01-25 12:00 1970Phaser是处理分阶段的多线程的很好的方法: 比如需求是: ... -
spring启动的时候尝试多线程发生的死锁
2014-09-12 11:12 3954具体的死锁线程dump: Found one Java-l ... -
System.nanoTime()的使用
2013-09-19 17:47 44588纳秒 ns(nanosecond):纳秒, 时间单位。一秒 ... -
java原子更新器AtomicReferenceFieldUpdater的使用
2013-09-19 11:32 15361AtomicReferenceFieldUpdater ... -
linux下文件的append是原子的(线程安全的)
2013-09-17 15:07 2894具体的理由可以参考这个文章:http://www.pagefa ... -
java Unsafe类的compareAndSwap方法
2013-09-15 12:43 18623compareAndSwap是个原子方法,原理是cas.就是说 ... -
java 反射的field.setAccessible(true)
2013-09-15 11:43 15414在java的反射使用中,如果字段是私有的,那么必须要对这个字段 ... -
ReentrantLock原理的源码解读
2013-09-15 01:16 12326可以参照http://blog.csdn.net/chen77 ... -
转 Java的Volatile
2013-09-07 17:24 1365原文:http://ifeve.com/syn-jmm-vol ...
相关推荐
根据实验需求,我们需要创建两个子线程,分别打印从 1 到 99 和从 100 到 199 的数字,并且这两个线程需要交替打印数字。 **3.1 创建打印线程** 首先,我们创建两个类 `Test1` 和 `Test2` 来代表两个子线程,它们...
在这个main方法中,程序通过两种方式创建了两个线程:一个打印1到1000之间的所有奇数,另一个打印所有偶数。通过使用while循环,程序会持续运行直到两个线程都完成了它们的任务。 总结来说,Java通过两种方式提供了...
1、编写程序,创建5个线程,分别输出5个线程的名字,用继承Thread类和实现Runnable接口的方法来实现。 2、以车站售票为例研究资源共享的问题。假设两个窗口同时出售一次列车的车票,车票就是共享资源,两个窗口就是...
线程 a 负责打印数字 1、2、3,而线程 b 负责打印数字 4、5、6。通过使用 synchronized 关键字,我们可以确保在某个时刻只有一个线程可以访问共享资源 LOCK。 在代码中,我们还可以看到使用了 wait() 和 notify() ...
本实验的任务是设计并实现一个数据单元,该单元包含学号和姓名两个字段,并且使用两个线程,一个用于写入数据,另一个用于读取数据。这种设计模式被称为“生产者-消费者”问题,是多线程编程中的经典案例。 首先,...
例如,如果创建了两个线程,一个打印1-50,另一个打印51-100。 2. **初始化AutoResetEvent**:每个线程在启动前都会获得一个`AutoResetEvent`实例,初始状态为未设置(即等待状态)。 3. **线程执行**:每个线程...
在本实验中,我们创建了两个线程:下载线程和打印线程,分别处理文章的下载和打印操作。 文章下载线程的任务是从网络或者其他来源获取文章,并将其存储到内存中的缓冲区。这个过程可能涉及到网络I/O操作,通常比较...
请使用继承Thread类的方式定义两个线程,一个线程可以计算1--100所有数字的累加和,另一个线程可以计算1--1000所有数字的累加和,每个线程计算完毕后各自打印计算结果,格式例如:”xxx线程计算1--100的累加和,结果...
标题提到的"3个线程,根据不同规则打印线程名称"是一个典型的多线程同步问题,通常涉及到线程的创建、线程间通信以及同步机制。 首先,我们要了解如何在Java中创建线程。有两类方式:一是继承`Thread`类,重写`run...
程序的核心功能是创建两个子线程,每个线程负责一个文件的字数统计,统计完成后,线程将结果写入共享内存区域,由父线程读取并打印出来。同时,程序需要解决线程同步和互斥问题,以确保数据的一致性和正确性。 **二...
我们可以创建一个全局的条件队列和一个锁,每个线程在打印字母前先获取锁,然后检查当前是否轮到自己打印。如果不是,则释放锁并等待;如果是,则打印字母并唤醒下一个等待的线程。这样,即使在多线程环境下,字母也...
本文将详细解析如何使用C++11的标准线程语法来实现两个线程轮流打印整数,其中一个线程打印奇数,另一个线程打印偶数,同时涉及到线程同步的关键技术——互斥量和条件变量。 首先,为了确保线程安全,我们需要使用...
标题“java 两个线程相互顺序输出”涉及的问题是如何在多线程环境下控制线程的执行顺序,使得两个线程可以按照特定的顺序交替打印输出。这通常涉及到线程同步和通信的概念。下面将详细解释这些知识点。 1. **线程...
【守护程序】在假脱机打印系统中,打印请求接收程序和打印程序是两个关键的守护进程。守护进程是在系统启动后持续运行的程序,负责监听和处理打印请求。打印请求接收程序接收客户端发送的打印请求,并将这些请求存入...
1. 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。 学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两个不同的时间间隔( 1 秒和 3 秒)在屏幕上显示当前时间。...
编写两个线程: 第一个线程计算2-1000000之间的质数及个数 第二个线程计算1000000-2000000之间的质数 及个数
本文将详细讲解如何利用MFC实现一个支持多线程打印调试日志的控件,并探讨其中涉及的关键技术,如内存池、锁机制以及多线程编程。 1. **MFC打印日志** MFC中的COutputWnd或CDocument等类通常用于处理输出,但它们...
一个小的关于进程的编写,可能不是很完善,还需在升入理解
* 创建两个线程 * 如果线程正常结束,得到线程的结束状态值,并打印 线程一完成以下操作: * 设置全局变量 key 的值为字符串“hello world” * 打印 3 次字符串“当前线程 ID:key 值” * 接收到线程二发送的取消...