- 浏览: 2571753 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (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 5657先说问题的结论:https:/ ... -
Calendar.getInstance()的坑
2016-12-06 16:50 5809Calendar.getInstance()看起来应该是个单例 ... -
java线程池自己掉进去的坑
2016-08-18 17:59 2083java线程池的maximumPoolSize的生效条件真的是 ... -
java比AtomicLong 更高效的LongAdder
2016-04-14 21:05 3185AtomicLong 是通过cas来实现的,已经很高效了,还有 ... -
java避免缓存伪共享
2016-04-14 20:15 904java8之前的做法: 加6个无用的long字段 如: ... -
java重复批次执行
2015-04-21 20:39 1464方案1 使用Phaser 方案2 使用CyclicBarr ... -
mina实现相同session后到的请求一定后处理的原理
2015-03-26 22:04 3707mina后面的业务处理是一个线程池去处理的,在线程池的多线程的 ... -
简单实现一个java公平策略的锁
2015-03-24 21:40 1366代码是: package com.eyu.gift.loc ... -
对java的BitSet的多线程并发的探索
2015-03-23 14:45 4131java的BitSet不是线程安全的,所以多线程的时候h要加锁 ... -
java的Condition 加强版的wait notify
2015-01-29 20:26 5206Lock对应Synchronized,使用之前都要先获取锁 ... -
java用cyclicBarrier来实现Phaser的分段功能
2015-01-26 10:22 1553cyclicBarrier是有自动重置功能的,我们可以用这个功 ... -
java的Phaser,多线程分阶段执行
2015-01-25 12:00 1913Phaser是处理分阶段的多线程的很好的方法: 比如需求是: ... -
spring启动的时候尝试多线程发生的死锁
2014-09-12 11:12 3883具体的死锁线程dump: Found one Java-l ... -
System.nanoTime()的使用
2013-09-19 17:47 44514纳秒 ns(nanosecond):纳秒, 时间单位。一秒 ... -
java原子更新器AtomicReferenceFieldUpdater的使用
2013-09-19 11:32 15242AtomicReferenceFieldUpdater ... -
linux下文件的append是原子的(线程安全的)
2013-09-17 15:07 2817具体的理由可以参考这个文章:http://www.pagefa ... -
java Unsafe类的compareAndSwap方法
2013-09-15 12:43 18513compareAndSwap是个原子方法,原理是cas.就是说 ... -
java 反射的field.setAccessible(true)
2013-09-15 11:43 15300在java的反射使用中,如果字段是私有的,那么必须要对这个字段 ... -
ReentrantLock原理的源码解读
2013-09-15 01:16 12277可以参照http://blog.csdn.net/chen77 ... -
转 Java的Volatile
2013-09-07 17:24 1308原文:http://ifeve.com/syn-jmm-vol ...
相关推荐
* 分别使用Runnable接口和Thread类编程实 编写一应用程序创建两个线程一个线程打印输出1—1000之间所有的奇数(Odd Number) * 另外一个线程打印输出1-1000之间所有的偶数(Even Number)要求两个线程随机休眠一 段...
1、编写程序,创建5个线程,分别输出5个线程的名字,用继承Thread类和实现Runnable接口的方法来实现。 2、以车站售票为例研究资源共享的问题。假设两个窗口同时出售一次列车的车票,车票就是共享资源,两个窗口就是...
1. 实现一个类ThreadMock(模拟线程),用来模仿Thread类,该类具有以下特征: a) Public class ThreadMock implents ...例如第一个线程打印1,接着第二个线程打印100,接着第一个线程打印2。。。。。。。。依此类推。
两个线程共享变量a,一个负责加一,一个负责输出 通过信号灯的pv操作完成
请使用继承Thread类的方式定义两个线程,一个线程可以计算1--100所有数字的累加和,另一个线程可以计算1--1000所有数字的累加和,每个线程计算完毕后各自打印计算结果,格式例如:”xxx线程计算1--100的累加和,结果...
一个线程打印123,另一个打印456,最终结果是打印123 456 123 45
本实验通过设计两个线程,一个是文章下载线程和一个文章打印线程,用来实现模拟线程同步打印机,文章下载线程实现把文章下载到缓冲区,文章打印线程实现把文章打印出来。
1. 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。 学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两个不同的时间间隔( 1 秒和 3 秒)在屏幕上显示当前时间。...
编写两个线程: 第一个线程计算2-1000000之间的质数及个数 第二个线程计算1000000-2000000之间的质数 及个数
一个小的关于进程的编写,可能不是很完善,还需在升入理解
报告包括源程序、主要功能模块、程序流程图、心得、程序调试等等,编写一个程序构建两个子线程,分别对两个文件的字数进行统计,两个线程统计完后写入到子线程与父线程共享的一段内存(或变量)中,然后父线程从这一...
利用线程的通信机制,用两个线程打印以下的结果: 1 2 A 3 4 B 5 6 C 7 8 D ... 49 50 Y 51 52 Z 即:数字和字母交替打印;
2) 第二个线程打印b字母100次 3) 第三个线程打印1~100的整数 采用继承Thread类的方式实现; 2. 利用Runnable接口实现与第1题相同的功能; 3. 测试一个Applet小应用程序,体会多线程程序的运行过程; 三、实验步骤 ...
5、写一个单线程程序,同样完成10万个随机数求和的计算,统计计算时间,并 和前面的结果对比; 6、让单线程程序睡眠四秒钟、多线程程序各子线程睡一秒的条件下(两程序的 总睡眠时间相同),对比执行结果; 7、分析...
要求利用线程同步编写一个多线程程序,模拟面包店面包师加工面包和销售面包的过程,当面包师加工一块面包时,打印输出“面包师加工出一块面包,现有面包有**块”;当店员1或店员2卖出一块面包时,打印输出“店员1或...
进程和线程的区别 进程和线程的区别可以总结为如下几点: 一个程序至少有一个进程,一个进程至少有一个线程,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。...
有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1~20这20个整型数。 (1) 每个生产者和消费者对有界...(2) 生产者和消费者各有两个以上。 (3) 多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。
1、 用C语言写一个程序名字为procs4,该程序运行过程中共有4个进程,procs4程序(父进程)创建2个子进程p1和p2,p1子进程再创建一个子进程p3。4个进程完成如下工作: 父进程并打印字符串“I am main process”;p1子...
6、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。 7、列出某个目录下的所有文件。 8、编写一个Hibernate程序,用来获得所有的学生信息。 9、使用Struts2框架来实现页面国际化。 10、写一个...
(1)源代码编写:编写源 C/C++及汇编程序; (2)程序编译:通过专用编译器编译程序; (3)软件仿真调试:在 SDK中仿真软件运行情况; (4)程序下载:通过 JTAG、USB、UART 方式下载到目标板上; 5)软...