zoukankan      html  css  js  c++  java
  • 两个线程交替打印字符串

    每个对象都有一内置锁

    wait方法 释放对象锁(不占对象锁)

    sleep方法不释放对象锁(占对象锁)

    优秀写法  (下面写法可能有问题,synchronized (LOCK)  提到 while前面就好了)

     1 class Info {
     2     String printStr = "i think this is ok";
     3     int i = 0;
     4 
     5     public void print() {
     6         if (i < printStr.length()) {
     7             System.out.println(Thread.currentThread().getName() + "  print   "
     8                     + printStr.charAt(i));
     9             i++;
    10         }
    11     }
    12 }
    13 
    14 public class main {
    15     private static Object LOCK = new Object();
    16     static Info info = new Info(); // 互斥资源
    17     static boolean flag = false; // false for a ,true for b
    18 
    19     public static void main(String[] args) {
    20         // 两个线程 交替打印字符串
    21         Thread a = new Thread() {
    22             public void run() {
    23                 while (info.i < info.printStr.length())
    24                     synchronized (LOCK) {
    25                         {
    26                             if (false == flag) {
    27                                 try {
    28                                     LOCK.wait();// 在wait后的瞬间线程b得到锁
    29                                 } catch (InterruptedException e) {
    30                                     e.printStackTrace();
    31                                 }
    32                             }
    33                             flag = false;
    34                             info.print();
    35                             LOCK.notify();// 在这里虽然唤醒了另一个线程b,但锁并没有释放
    36                         }
    37                     }
    38             };
    39         };
    40         Thread b = new Thread() {
    41             public void run() {
    42                 while (info.i < info.printStr.length())
    43                     synchronized (LOCK) {
    44                         {
    45                             if (true == flag) {
    46                                 try {
    47                                     LOCK.wait();// 在wait后的瞬间线程b得到锁
    48                                 } catch (InterruptedException e) {
    49                                     e.printStackTrace();
    50                                 }
    51                             }
    52                             flag = true;
    53                             info.print();
    54                             LOCK.notify();// 在这里虽然唤醒了另一个线程b,但锁并没有释放
    55                         }
    56                     }
    57             };
    58         };
    59         a.start();
    60         b.start();
    61     }
    62 
    63 }

    代码1

     1 package ThreadTest;
     2 
     3 
     4 class Info
     5 {
     6     String printStr="i think this is ok";
     7     int i=0;
     8     boolean flag=false;
     9     public  void print1()
    10     {
    11         synchronized(this)
    12         {
    13             if(flag==false)
    14             {
    15                 try {
    16                     this.wait();
    17                 } catch (InterruptedException e) {
    18                     e.printStackTrace();
    19                 }
    20             }
    21         realprint();
    22         flag=false;
    23         notify();
    24         }
    25     }
    26     public  void print2()
    27     {
    28         synchronized(this)
    29         {
    30             if(flag==true)
    31             {
    32                 try {
    33                     this.wait();
    34                 } catch (InterruptedException e) {
    35                     e.printStackTrace();
    36                 }
    37             }
    38         realprint();
    39         flag=true;
    40         notify();
    41         }
    42     }
    43     public void realprint()
    44     {
    45         if(i<printStr.length())
    46         {
    47             System.out.println(Thread.currentThread().getName() +"  print   "+printStr.charAt(i));
    48             i++;
    49         }
    50     }
    51 }
    52 class MyThread1 extends Thread
    53 {
    54     public Info info=null;
    55     public MyThread1(Info in) {
    56         this.info=in;
    57     }
    58     @Override
    59     public void run()
    60     {
    61         while(info.i<info.printStr.length())
    62             info.print2();
    63     }
    64 }
    65 class MyThread2 extends Thread
    66 {
    67     public Info info=null;
    68     public MyThread2(Info in) {
    69         this.info=in;
    70     }
    71     @Override
    72     public void run()
    73     {    
    74         while(info.i<info.printStr.length())
    75             info.print1();
    76     }
    77 }
    78 public class main {
    79     public static void main(String[] args) {
    80         //两个线程    交替打印字符串
    81         Info info=new Info();                                    //互斥资源
    82         MyThread1 mthread1=new MyThread1(info);
    83         MyThread2 mthread2=new MyThread2(info);
    84         new Thread(mthread1).start();
    85         new Thread(mthread2).start();
    86     }
    87 
    88 }

    代码2

      1 package MyThreadMethod;
      2 
      3 import java.util.concurrent.locks.Condition;
      4 import java.util.concurrent.locks.ReentrantLock;
      5 
      6 class Info
      7 {
      8     String printStr="i think this is ok";
      9     int i=0;
     10     public  void print1()
     11     {
     12         if(i<printStr.length())
     13         {
     14             System.out.println(Thread.currentThread().getName() +"  print   "+printStr.charAt(i));
     15             i++;
     16         }
     17     }
     18 }
     19 public class threadMethod {
     20     ReentrantLock lock=new ReentrantLock();
     21     Condition con1=lock.newCondition();
     22     Condition con2=lock.newCondition();
     23     boolean flag=false;
     24     public class MyThread1 extends Thread 
     25     {
     26         public Info info=null;
     27         MyThread1(Info info)
     28         {
     29             this.info=info;
     30         }
     31         @Override
     32         public void run() {
     33             while(info.i<info.printStr.length())
     34             {
     35                 lock.lock();
     36                 try
     37                 {
     38                     while(flag==true)
     39                     {
     40                             try {
     41                                 con1.await();
     42                             } catch (InterruptedException e) {
     43                                 // TODO Auto-generated catch block
     44                                 e.printStackTrace();
     45                             }
     46                     }
     47                     info.print1();
     48                     flag=true;
     49                     con2.signal();
     50                 }
     51                     finally
     52                     {
     53                         lock.unlock();
     54                     }
     55                 }
     56         }
     57     }
     58     
     59     public  class MyThread2 extends Thread 
     60     {
     61         public Info info=null;
     62         MyThread2(Info info)
     63         {
     64             this.info=info;
     65         }
     66         @Override
     67         public void run() {
     68             while(info.i<info.printStr.length())
     69             {
     70                 lock.lock();
     71                 try
     72                 {
     73                     while(flag==false)
     74                     {
     75                             try {
     76                                 con2.await();
     77                             } catch (InterruptedException e) {
     78                                 // TODO Auto-generated catch block
     79                                 e.printStackTrace();
     80                             }
     81                     }
     82                     info.print1();
     83                     flag=false;
     84                     con1.signal();
     85                 }
     86                     finally
     87                     {
     88                         lock.unlock();
     89                     }
     90                 }
     91         }
     92     }
     93     public static void main(String[] args) {
     94         threadMethod tm=new threadMethod();
     95         Info info=new Info();
     96         MyThread1 thread1=tm.new MyThread1(info);
     97         MyThread2 thread2=tm.new MyThread2(info);
     98         thread1.start();
     99         thread2.start();
    100         
    101 
    102     }
    103 
    104 }

    3 不同写法

     1 class Info
     2 {
     3     String printStr="i think this is ok";
     4     int i=0;
     5     public void print()
     6     {
     7         if(i<printStr.length())
     8         {
     9             System.out.println(Thread.currentThread().getName() +"  print   "+printStr.charAt(i));
    10             i++;
    11         }
    12     }
    13 }
    14 public class main {
    15     private static Object LOCK = new Object();  
    16     static Info info=new Info();                                    //互斥资源
    17     static boolean flag=false;  //false for a ,true for b
    18     public static void main(String[] args) {
    19         //两个线程    交替打印字符串
    20         Thread a=new Thread(){
    21             public void run() {
    22                     while(info.i<info.printStr.length())
    23                         synchronized (LOCK) {
    24                     {
    25                         if(false==flag)
    26                         {
    27                             flag=true;
    28                             info.print();
    29                             LOCK.notify();//在这里虽然唤醒了另一个线程b,但锁并没有释放
    30                             try {
    31                                 if(info.i<info.printStr.length())
    32                                     LOCK.wait();//在wait后的瞬间线程b得到锁  
    33                             } catch (InterruptedException e) {
    34                                 e.printStackTrace();
    35                             }
    36                         }
    37                     }
    38                 }
    39             };
    40         };
    41         Thread b=new Thread(){
    42             public void run() {
    43                     while(info.i<info.printStr.length())
    44                         synchronized (LOCK) {
    45                     {
    46                         if(true==flag)
    47                         {
    48                             flag=false;
    49                             info.print();
    50                             LOCK.notify();//在这里虽然唤醒了另一个线程b,但锁并没有释放
    51                             try {
    52                                 if(info.i<info.printStr.length())
    53                                     LOCK.wait();//在wait后的瞬间线程b得到锁  
    54                             } catch (InterruptedException e) {
    55                                 e.printStackTrace();
    56                             }
    57                         }
    58                     }
    59                 }
    60             };
    61         };
    62         a.start();
    63         b.start();
    64     }
    65 
    66 }
  • 相关阅读:
    C++-类的const成员变量
    Linux-编译器gcc/g++编译步骤
    C++-理解构造函数、析构函数执行顺序
    Linux-Unix版本介绍
    C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast
    Linux-如何查看登陆shell的类型
    C++-不要在构造和析构函数中调用虚函数
    C++-模板的声明和实现为何要放在头文件中
    C++-函数模板特化如何避免重复定义
    Linux-Gcc生成和使用静态库和动态库详解
  • 原文地址:https://www.cnblogs.com/friends-wf/p/3658258.html
Copyright © 2011-2022 走看看