线程同步面试题,3个线程打印一个1-100的数组,要求P1=1,P2=2,P3=3,P1=4的形式
来源:互联网 发布:天猫抢优惠券软件 编辑:程序博客网 时间:2024/05/23 00:28
当时没有答好回来总结一下总结了两个方式
一,这个方式是利用Object.notify(),Object.wait(),两个方法来实现。
中心思想:保证应该到哪个线程打印时,只有该线程是唤醒状态,其他都是暂停状态。比如需要P1打印1,那就要让P2,P3都是wait()状态。
package com.example.ly.mydemo;public class WaitObjectTest implements Runnable { private static int i = 0; private Object selfO = null; private Object pref = null; public WaitObjectTest(Object selfO, Object pref) { this.selfO = selfO; this.pref = pref; } @Override public void run() { System.out.println("threadId: " + Thread.currentThread().getName()); while (i < 30) { synchronized (pref) { synchronized (selfO) { System.out.println("threadId: " + Thread.currentThread().getName() + " i: " + i); i++; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } selfO.notify(); } try { pref.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { int[] object1 = new int[0]; int[] object2 = new int[0]; int[] object3 = new int[0]; WaitObjectTest mRunnableA = new WaitObjectTest(object1, object3); WaitObjectTest mRunnableB = new WaitObjectTest(object2, object1); WaitObjectTest mRunnableC = new WaitObjectTest(object3, object2); Thread threadA = new Thread(mRunnableA, "A"); Thread threadB = new Thread(mRunnableB, "B"); Thread threadC = new Thread(mRunnableC, "C"); threadA.start(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } threadB.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } threadC.start(); }}
二,这个方式我和朋友一个完善的一个方法,中心思想是:只synchronized数组,用循环来控制打印,就是打印需要的不需要的就continue。
class A implements Runnable { Thread p1, p2, p3; int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8,9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}; int count = 0; public A() { p1 = new Thread(this,"0"); p2 = new Thread(this,"1"); p3 = new Thread(this,"2"); p1.start(); p2.start(); p3.start(); } @Override public void run() { while (count < arr.length) { synchronized (arr) { String threadName = Thread.currentThread().getName(); if (count % 3 == Integer.valueOf(threadName)) { LogUtils.writeLog("p:" + (Integer.valueOf(threadName)+1) + "=" + arr[count]); count++; } else { continue; } } } } }
总结:
1.第一个方法是朋友提供的,其实我不是很喜欢代码多,可读性差,但是第一个种方法可以帮助理解线程同步的原理,所以也贴出来大家一起学习一下。
2.第二种方法是我跟朋友一起总结出来的。是我自己觉得比较好的方式,毕竟核心代码比较少,而且满足了需求。
3.线程同步主要是synchronized关键字来控制访问,必要时配合Object的Object.notify(),Object.wait(),两个方法,实际上Java还提供了专门针对线程同步问题的类,回头再针对线程同步问题做一篇总结吧。
0 0
- 线程同步面试题,3个线程打印一个1-100的数组,要求P1=1,P2=2,P3=3,P1=4的形式
- 算法二:计算1-3000 等于p1*p1*p2的数,其中p1!=p2且都是质数
- 计算nth 个质因数是p1,p2,p3的数
- 指针*p2++=*p1++_chris
- char* p3 = "1";和char* p1 = 1;区别
- 简单问题1——while(*p2++=*p1++);
- 给定一个平面内三个不同的点p1、p2和p3,求出任意两点(即点p1和点p2、点p1和点p3、点p2和点p3)之间的距离。
- 等待事件对应的p1,p2,p3含义
- 等待事件对应的p1,p2,p3含义
- STC12C5A60S2双串口程序。串口1P3.0和P3.1、串口2P1.3和P1.2。
- 【Chapter 1】P1-P2
- P1.1, P1.2做输入, P1.3做输出, 控制一个5V继电器
- int *p1 = new int[10]; int *p2 = new int[10](); 的区别
- 【LVL1_5_c】【思考题】【7】char *p1="hellow world"和char p2[]="hellow world"的区别
- char *p1="china" 与char p2[]="china"的区别
- POJ 2909 Goldbach's Conjecture (求x=p1+p2)
- 笛卡尔乘积运算结果的输出{n1,n2...}*{m1,m2,m3..}*{p1,p2,p3...}*....
- 笛卡尔乘积运算结果的输出{n1,n2...}*{m1,m2,m3..}*{p1,p2,p3...}*
- LWIP 学习博客
- 数字图像处理的基本原理和常用方法
- 合并hive仓库中小文件
- 面试题解析001:Java对象创建及初始化
- 通用管理系统的思考
- 线程同步面试题,3个线程打印一个1-100的数组,要求P1=1,P2=2,P3=3,P1=4的形式
- HDU 4465 Candy【指数表示法】E
- 不是打印控件没有安装
- BZOJ 斜率优化大水题(集)2 1096
- PHP 为Thinkphp 配置 Nginx phpinfo 模式
- Connection attempts: 11Adb connection Error:远程主机强迫关闭了一个现有的连接
- 内部类
- 2016.10.7 【NOIP2016提高A组五校联考4】 总结
- VS2008快捷键,希望能有所帮助