题目:编写程序实现两个线程一个线程输出0、2、3…51,另外一个线程实现A...Z, a...z,(49x50y51z)
很多地方都可以见到类似的笔试题或者面试题,今天小辉以自己认知的范围内列举了如下6种方法,如果你们还有其他的方法留言给小辉,小辉立马学习改正。
public static void useSynchronizedAndWaitAndNotify() {Object object = new Object();new Thread(() -> {synchronized (object) {for (int i = 0; i < 52; i++) {try {ify();System.out.print(i);object.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}).start();new Thread(() -> {synchronized (object) {for (int i = 0; i < 52; i++) {try {char ch = getChar(i);ify();System.out.print(ch);object.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}
使用put和transfer都可以,put是异步的,transfer是阻塞的。
public static void useTransferQueue() {LinkedTransferQueue queue1 = new LinkedTransferQueue();LinkedTransferQueue queue2 = new LinkedTransferQueue();new Thread(() -> {for (int i = 0; i < 52; i++) {try {ansfer(i);
// queue1.put(i);System.out.print(queue2.take());} catch (Exception e) {e.printStackTrace();}}}).start();new Thread(() -> {for (int i = 0; i < 52; i++) {try {System.out.print(queue1.take());char ch = getChar(i);ansfer(ch);
// queue2.put(ch);} catch (Exception e) {e.printStackTrace();}}}).start();}
使用Lock锁和Condition条件,这种写法注意的是加锁后一定要解锁。使用这样的写法你写多个线程交替循环执行也很容易实现,业务代码放在signal和await前面,中间,后面有一些差别的哦。
public static void useLockAndCondition() {Lock lock = new ReentrantLock();Condition condition1 = wCondition();Condition condition2 = wCondition();new Thread(() -> {for (int i = 0; i < 52; i++) {lock.lock();try {System.out.print(i);condition2.signal();condition1.await();} catch (Exception e) {e.printStackTrace();
本文发布于:2024-02-02 20:36:24,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170687738546291.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |