java多線程常見六種

java多線程 六脈神劍

  1. BlockingQueue
  2. 信號(hào)量Semaphore
  3. synchronized + 標(biāo)志位 + 喚醒
  4. ReentrantLock + Condition
  5. 自旋yield()讓出CPU
  6. CyclicBarrier控制先后 或使用CountDownLatch+CyclicBarrier
解決下列問題
class FooBar{
  public void foo(){
    for(int i=0;i<n;i++){
      print("foo");
    }
  }
  public void bar(){
    for(int i=0;i<n;i++){
      print("bar");
    }
  }
}
兩個(gè)不同線程公用一個(gè)FooBar實(shí)例  其中一個(gè)線程調(diào)用foo() 另一個(gè)線程調(diào)用bar()

設(shè)計(jì)修改程序,保證“foobar”被輸出n次

示例: 輸入n=2   輸出 “foobarfoobar”
1.利用BlockingQueue
class Foobar{
  private int n;
  private BlockingQueue<Integer> bar = new LinkedBlockingQueue<>(1);
  private BlockingQueue<Integer> foo = new LinkedBlockingQueue<>(1);
  public FooBar(int n){
    this.n= n;
  }
  public void foo(Runnable printFoo)throws InterruptedException{
    for(int i=0;i<n;i++){
      foo.put(i);
      printFoo.run();
      bar.put(i);
    }
  }
  public void bar(Runnable printBar)throws InterruptedException{
    for(int i=0;i<n;i++){
      bar.take();
      printBar.run();
      foo.take();
    }
  }
}
2.利用Semaphore
class FooBar{
  private int n;
  private Semaphore foo = new Semaphore(1);
  private Semaphore bar = new Semaphore(0);
  public FooBar(int n){
    this.n= n;
  }
  public void foo(Runnable printFoo)throws InterruptedException{
    for(int i=0;i<n;i++){
      foo.acquire();
      printFoo.run();
      bar.release();
    }
  }
  public void bar(Runnable printBar)throws InterruptedExceptions{
    for(int i=0;i<n;i++){
      bar.acquire();
      printBar.run();
      foo.release();
    }
  }
}

3.利用synchronized + 標(biāo)志位 + 喚醒
class FooBar{
    private int n;
    private volatile boolean type = true;
    private Object foo = new Object();
    public FooBar(int n){
        this.n=n;
    }
    public void foo(Runnable printFoo)throws InterruptedException{
      for(int i=0;i<n;i++){
        synchronized(foo){
          while(!type){
            foo.wait();
          }
          printFoo.run();
          type = false;
          foo.notifyAll();
        }
      }
    }
    public void bar(Runnable printBar)throws InterruptedException{
      for(int i=0;i<n;i++){
        synchronized(foo){
          while(type){
            foo.wait();
          }
          printBar.run();
          type= true;
          foo.notifyAll();
        }
      }
    }
}
4.利用可重入鎖ReentrantLock+Condition
class FooBar{
  private int n;
  private Lock lock = new ReentrantLock(true);
  private final Condition foo = lock.newCondition();
  private volatile boolean flag = true;
  public FooBar(int n){
    this.n = n;
  }
  public void foo(Runnable printFoo)throws InterruptedException{
    for(int i=0;i<n;i++){
      lock.lock();
      try{
        while(!flag){
          foo.await();
        }
        printFoo.run();
        flag=false;
        foo.signal();
      }finally{
        lock.unlock();
      }
    }
  }
  public void bar(Runnable printBar)throws InterruptedException{
    for(int i=0;i<n;i++){
      lock.lock();
      try{
        while(flag){
          foo.await();
        }
        printBar.run();
        flag= true;
        foo.signal();
      }finally{
        lock.unlock();
      }
    }
  }
}

5.利用自旋讓出CPU
class FooBar{
  private int n;
  private volatile boolean flag = true;
  public FooBar(int n){
    this.n=n;
  }
  public void foo(Runnable printFoo)throws InterruptedException{
    for(int i=0;i<n;){
      if(flag){
        printFoo.run();
        i++;
        flag= false;
      }else{
        Thread.yield();
      }
    }
  }
  public void bar(Runnable printBar)throws InterruptedException{
    for(int i=0;i<n;){
      if(!flag){
        printBar.run();
        i++;
        flag = true;
      }else{
        Thread.yield();
      }
    }
  }
}
6.利用CyclicBarrier控制先后
class FooBar{
  private int n;
  volatile boolean flag = true;
  CyclicBarrier cb = new CyclicBarrier(2);
  
  public FooBar(int n){
    this.n=n;
  }
  public void foo(Runnable printFoo)throws InterruptedException{
    for(int i = 0;i<n;i++){
      while(!flag);
      printFoo.run();
      flag=false;
      try{
        cb.await();
      }catach(Exception e){
        
      }
    }
  }
  public void bar(Runnable printBar)throws InterruptedException{
    for(int i=0;i<n;i++){
      try{
        cb.await();
      }catch(Exception e){
        
      }
      printBar.run();
      flag=true;
    }
  }
}
利用CountDownLatch保證任務(wù)執(zhí)行的先后順序,CyclicBarrier保證任務(wù)按組進(jìn)行
class FooBar{
  private int n;
  private CountDownLatch a;
  private CyclicBarrier barrier;
  public FooBar(int n){
    this.n=n;
    a = new CountDownLatch(1);
    barrier= new CyclicBarrier(2);
  }
  public void foo(Runnable printFoo)throws InterruptedException{
    try{
      for(int i=0;i<n;i++){
        printFoo.run();
        a.countDown();
        barrier.await();
      }
    }catch(Exception e){
      
    }
  }
  public void bar(Runnable printBar)throws InterruptedException{
    try{
      for(int i=0;i<n;i++){
        a.await();
        printBar.run();
        a = new CountDownLatch(1);
        barrier.await();
      }
    }catch(Exception e){
      
    }
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容