• 使多个线程循环输出099099


    直接上代码,后面我也有一个问题,关于对象的notifyAll或者notify或者single或者singleAll,唤醒线程是顺序唤醒吗,我这里都是顺序输出了

    关于公平与非公平锁的问题?唤醒是公平的???又没有大佬帮助解答!

    复制代码
     1 import java.util.concurrent.LinkedBlockingQueue;
     2 import java.util.concurrent.ThreadPoolExecutor;
     3 import java.util.concurrent.TimeUnit;
     4 import java.util.concurrent.locks.Condition;
     5 import java.util.concurrent.locks.Lock;
     6 import java.util.concurrent.locks.ReentrantLock;
     7 
     8 /**
     9  * 使用lock对象,使多个线程循环输出0-99-0-99
    10  */
    11 public class AandBforTOthreadLock {
    12     private static Lock lock=new ReentrantLock();
    13     private static Condition single=lock.newCondition();
    14     static class A implements Runnable{
    15         private int i=0;
    16         public A(int i){
    17             this.i=i;
    18         }
    19         @Override
    20         public void run() {
    21             try {
    22                 lock.lock();
    23                 while (true){
    24                     System.out.println(i);
    25                     single.await();
    26                     single.signal();
    27                 }
    28             }catch (Exception e){
    29                 e.printStackTrace();
    30             }finally {
    31                 lock.unlock();
    32             }
    33         }
    34     }
    35     static class B implements Runnable{
    36         @Override
    37         public void run() {
    38             try {
    39                 lock.lock();
    40                 while (true){
    41                     System.out.println("99");
    42                     single.signalAll();
    43                     single.await();
    44                 }
    45             }catch (Exception e){
    46                 e.printStackTrace();
    47             }finally {
    48                 lock.unlock();
    49             }
    50         }
    51     }
    52 
    53     public static void main(String[] args) throws InterruptedException {
    54         ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(100,100,0L, TimeUnit.MILLISECONDS,
    55                 new LinkedBlockingQueue<Runnable>());
    56         for (int i=0;i<99;i++){
    57             threadPoolExecutor.execute(new A(i));
    58             Thread.sleep(3l);
    59         }
    60         Thread.sleep(10000l);
    61         threadPoolExecutor.execute(new B());
    62     }
    63 
    64 }
    输出:

    ……

    
    
  • 相关阅读:
    要回家了,想到以后..
    面试应注意的问题by JohnPhilips(转自matrix论坛)
    在痛苦中坚持,翻译啊
    数据抓取和分析~~
    不考研,就很闲吗?
    在Swing中使用高级的MVC和POJOs
    测试驱动
    开始找工作了,先记个流水帐
    又是开学的时候了
    开发者想要什么算是我的翻译作品的处女作吧,呵呵,致力于英语学习..
  • 原文地址:https://www.cnblogs.com/qfxydtk/p/8728840.html
Copyright © 2020-2023  润新知