黑马程序员技术交流社区

标题: 多线程中加了锁还是不能杜绝其他线程进入加锁的代码块..... [打印本页]

作者: 小白想学javaEE    时间: 2016-4-20 22:15
标题: 多线程中加了锁还是不能杜绝其他线程进入加锁的代码块.....
  1. package test11;
  2. package test11;
  3. /*题目1:编写一个多线程程序,每隔30ms输出线程的名字(线程至少3个以上)【多线程】。

  4. */
  5. public class ThreadTest {
  6. public static void main(String[] args) {
  7. TimeMillis tm=new TimeMillis();
  8. MyThread mt1=new MyThread(tm);
  9. MyThread mt2=new MyThread(tm);
  10. MyThread mt3=new MyThread(tm);
  11. MyThread mt4=new MyThread(tm);
  12. MyThread mt5=new MyThread(tm);

  13. new Thread(mt1).start();
  14. new Thread(mt2).start();
  15. new Thread(mt3).start();
  16. new Thread(mt4).start();
  17. new Thread(mt5).start();
  18. }
  19. }

  20. import java.util.concurrent.locks.Condition;
  21. import java.util.concurrent.locks.Lock;
  22. import java.util.concurrent.locks.ReentrantLock;

  23. public class TimeMillis {
  24. //创建对象时初始化属性t,获取系统时间 要使用同步
  25. private long t=System.currentTimeMillis();
  26. private int count=0;
  27. private Lock lock=new ReentrantLock();
  28. private Condition con=lock.newCondition();
  29. private boolean flag;
  30. private int x=1;
  31. void getTime() throws InterruptedException{
  32. lock.lock();
  33. try{
  34. while(flag){
  35. con.await();
  36. }
  37. flag=true;
  38. //线程执行时获取系统时间
  39. long t1= System.currentTimeMillis();
  40. //判断线程执行时的系统时间和对象初始化的系统时间差值是否是30的整数倍,是就打印线程名
  41. if(((t1-t)/30)>=x){
  42. x++;
  43. count++;
  44. System.out.println(t1);
  45. System.out.println(Thread.currentThread().getName()+"第"+count+"次"+(t1-t));
  46. }
  47. flag=false;
  48. con.signal();
  49. }finally{
  50. lock.unlock();
  51. }

  52. }
  53. }
  54. package test11;

  55. public class MyThread implements Runnable {
  56. private TimeMillis tm;
  57. MyThread(TimeMillis tm){
  58. this.tm=tm;
  59. }
  60. //线程的执行语句
  61. public void run() {
  62. int x=0;
  63. while(x<10000){
  64. x++;
  65. try {
  66. tm.getTime();
  67. } catch (Exception e) {
  68. System.out.println("线程异常中断");
  69. }
  70. }
  71. }
  72. }
复制代码






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2