这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
分享:技术:java:某公司笔试题 [2018/04/12 13:55] gxx 创建 |
分享:技术:java:某公司笔试题 [2019/04/30 10:41] (当前版本) gxx |
||
---|---|---|---|
行 118: | 行 118: | ||
===== 并发编程 ===== | ===== 并发编程 ===== | ||
实现逻辑:n个线程并发,按顺序打印1,2,3...,n,n+1,n+2,...,2n,2n+1,2n+2... | 实现逻辑:n个线程并发,按顺序打印1,2,3...,n,n+1,n+2,...,2n,2n+1,2n+2... | ||
- | ==== PrintObject.java ==== | + | ==== 解法1 ==== |
+ | 使用ReentrantLock condition await signalAll搞定 | ||
+ | === PrintObject.java === | ||
<code java PrintObject.java> | <code java PrintObject.java> | ||
package com.gxx.record.gtja; | package com.gxx.record.gtja; | ||
行 193: | 行 195: | ||
} | } | ||
</code> | </code> | ||
- | ==== MyThread.java ==== | + | === MyThread.java === |
<code java MyThread.java> | <code java MyThread.java> | ||
package com.gxx.record.gtja; | package com.gxx.record.gtja; | ||
行 231: | 行 233: | ||
} | } | ||
</code> | </code> | ||
- | ==== Main.java ==== | + | === Main.java === |
<code java Main.java> | <code java Main.java> | ||
package com.gxx.record.gtja; | package com.gxx.record.gtja; | ||
行 281: | 行 283: | ||
1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5, | 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5, | ||
</code> | </code> | ||
+ | ==== 解法2 ==== | ||
+ | 使用wait notifyAll搞定 | ||
+ | === LockObject.java === | ||
+ | <code java LockObject.java> | ||
+ | package com.gxx.test; | ||
+ | |||
+ | /** | ||
+ | * 锁对象 | ||
+ | */ | ||
+ | public class LockObject { | ||
+ | //计数 | ||
+ | int count; | ||
+ | } | ||
+ | </code> | ||
+ | === MyThread.java === | ||
+ | <code java MyThread.java> | ||
+ | package com.gxx.test; | ||
+ | |||
+ | /** | ||
+ | * 线程 | ||
+ | */ | ||
+ | public class MyThread extends Thread { | ||
+ | int index;//索引 | ||
+ | LockObject lockObject;//锁对象 | ||
+ | int threadCount;//线程总数 | ||
+ | |||
+ | /** | ||
+ | * 构造方法 | ||
+ | * @param index | ||
+ | * @param lockObject | ||
+ | * @param threadCount | ||
+ | */ | ||
+ | public MyThread(int index, LockObject lockObject, int threadCount) { | ||
+ | this.index = index; | ||
+ | this.lockObject = lockObject; | ||
+ | this.threadCount = threadCount; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void run() { | ||
+ | /** | ||
+ | * 锁,只有一个线程进入 | ||
+ | */ | ||
+ | synchronized (lockObject) { | ||
+ | while (true) { | ||
+ | try { | ||
+ | if (lockObject.count % threadCount == index) { | ||
+ | System.out.println((lockObject.count+1) + ","); | ||
+ | Thread.sleep(100); | ||
+ | lockObject.count ++; | ||
+ | /** | ||
+ | * 唤起wait的线程 | ||
+ | */ | ||
+ | lockObject.notifyAll(); | ||
+ | } else { | ||
+ | /** | ||
+ | * 释放锁 | ||
+ | */ | ||
+ | lockObject.wait(); | ||
+ | } | ||
+ | } catch (Exception e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | === PrintThreadTest.java === | ||
+ | <code java PrintThreadTest.java> | ||
+ | package com.gxx.test; | ||
+ | |||
+ | /** | ||
+ | * 多线程打印测试 | ||
+ | */ | ||
+ | public class PrintThreadTest { | ||
+ | |||
+ | /** | ||
+ | * main方法 | ||
+ | * @param args | ||
+ | * @throws Exception | ||
+ | */ | ||
+ | public static void main(String[] args) throws Exception { | ||
+ | /** | ||
+ | * 锁对象 | ||
+ | */ | ||
+ | LockObject lockObject = new LockObject(); | ||
+ | |||
+ | /** | ||
+ | * 线程总数 | ||
+ | */ | ||
+ | int threadCount = 5; | ||
+ | for(int i=0;i<threadCount;i++) { | ||
+ | /** | ||
+ | * 构造线程 | ||
+ | */ | ||
+ | new MyThread(i, lockObject, threadCount).start(); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 主线程hold住 | ||
+ | */ | ||
+ | System.in.read(); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | === 输出 === | ||
+ | <code> | ||
+ | 1, | ||
+ | 2, | ||
+ | 3, | ||
+ | 4, | ||
+ | 5, | ||
+ | 6, | ||
+ | 7, | ||
+ | 8, | ||
+ | 9, | ||
+ | 10, | ||
+ | 11, | ||
+ | 12, | ||
+ | 13, | ||
+ | 14, | ||
+ | 15, | ||
+ | 16, | ||
+ | 17, | ||
+ | 18, | ||
+ | 19, | ||
+ | ... | ||
+ | </code> | ||
+ |