java线程池之synchronized锁

 1  //Object 定义了一个引用类型的对象用于加锁
 2     static Object Lock = new Object();  3     //定义一个int类型变量0作初始值
 4     static int iCheck = 0;  5 
 6     public static void main(String[] args) {  7         //第一个线程
 8         int a = 0;  9         //建立一个数组保存打印的数值
10         List<Integer> list = new ArrayList<>(); 11         //设置线程池大小为4
12         ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4); 13         //i从0开始递增1,直到小于1000跳出循环
14         for (int i = 0; i < 1000; i++) { 15  list.add(a); 16             a++; 17  } 18         //循环触发4个任务丢给线程池处理
19         for (int i = 0; i < list.size(); i++) { 20             int z = list.get(i); 21             //把任务交给线程池
22             fixedThreadPool.execute(() -> { 23  Test(z); 24  }); 25  } 26  } 27 
28     public static void Test(int z) { 29         try { 30             do { 31                 //从0开始递增,
32                 if (iCheck == z) { 33                     synchronized (Lock) { 34                         //输出线程名称和当前值
35                         System.out.println(Thread.currentThread().getName() + " " + z); 36                         iCheck += 1; 37  } 38                     break; 39  } 40                 //让出cup时间给其余知足条件的线程执行
41  Thread.yield(); 42 
43             } while (true); 44             //每一个线程休息1秒后继续工做,4个线程完成循环后第一个线程继续工做
45             Thread.sleep(1000); 46         } catch (InterruptedException e) { 47  } 48     }

pool-1-thread-1 0
pool-1-thread-2 1
pool-1-thread-3 2
pool-1-thread-4 3
pool-1-thread-1 4
pool-1-thread-3 5
pool-1-thread-4 6
pool-1-thread-2 7
pool-1-thread-1 8数组

打印结果顺序输出spa

相关文章
相关标签/搜索