java线程详解

编程技术  /  houtizong 发布于 3年前   151

 

package test;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Test {private static int threadCount = 4;//线程辅助类private static CountDownLatch countDown = new CountDownLatch(4);// 创建线程池,线程数threadCountprivate static ExecutorService exec = Executors.newFixedThreadPool(threadCount);public static void main(String[] args) throws InterruptedException {thread();}//堵塞时间(3秒)static int sleep = 3000;private static void thread() throws InterruptedException {//循环1for (int index = 1; index < 5; index++) {System.out.println("任务:"+index);final int NO = index;Runnable run = new Runnable() {public void run() {//循环2for (int i = 1; i < 5; i++) {try {//打印iSystem.out.println("i="+i);//堵塞Thread.sleep(sleep);} catch (InterruptedException e) {e.printStackTrace();}//打印结果System.out.println("第" + NO + "次任务," + "第" + i + "次执行!");}// 递减,每次减一countDown.countDown();}};exec.submit(run);}// 等待线程全部执行完毕,确保程序的流程// 当递减为0时,执行countDown.await();// 关闭exec.shutdown();System.out.println("finish");}}

 运行结果

任务:1任务:2任务:3任务:4i=1i=1i=1i=1第1次任务,第1次执行!i=2第3次任务,第1次执行!i=2第2次任务,第1次执行!i=2第4次任务,第1次执行!i=2第1次任务,第2次执行!i=3第3次任务,第2次执行!i=3第2次任务,第2次执行!i=3第4次任务,第2次执行!i=3第3次任务,第3次执行!i=4第1次任务,第3次执行!i=4第2次任务,第3次执行!i=4第4次任务,第3次执行!i=4第3次任务,第4次执行!第1次任务,第4次执行!第2次任务,第4次执行!第4次任务,第4次执行!finish

 

代码详解

 

1.主线程main开启后执行到了“循环1”,“循环1“执行了4次,打印结果是(如下),顺序可能会错乱,

”循环1“执行后,4个线程挂起执行,由于Thread.sleep()堵塞的原因,run方法只能先执行到”打印i“代码,堵塞时间设置的3秒,3秒之内,”打印i“代码块已经执行完了,3秒之后会继续执行挂起的任务后面的部分

任务:1任务:2任务:3任务:4i=1i=1i=1i=1

2.第一次堵塞之后,也就是3秒之后执行Thread.sleep()下面的代码,所以执行”打印结果“代码块,由于线程的原因,打印的任务也是随机的,由于run方法里有”循环2“,所以打印过后执行”打印i“代码块,

第1次任务,第1次执行!i=2

 3.由于设置了线程池,并且大小是4,所以每次会允许四个线程同时执行

第1次任务,第1次执行!i=2第3次任务,第1次执行!i=2第2次任务,第1次执行!i=2第4次任务,第1次执行!i=2

 4.按循环执行,直到最后,最后四次没有打印”i=5“,因为最后一次打印循环结束了,”打印i“是在第二次循环中,并不是在本次循环中

 

第3次任务,第4次执行!第1次任务,第4次执行!第2次任务,第4次执行!第4次任务,第4次执行!

 5.最后打印finish

 

 

以下是threadCount=3的代码详解:

 

package test;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Test6 {private static int threadCount = 3;//线程辅助类private static CountDownLatch countDown = new CountDownLatch(4);// 创建线程池,线程数threadCountprivate static ExecutorService exec = Executors.newFixedThreadPool(threadCount);public static void main(String[] args) throws InterruptedException {thread();}//堵塞时间(3秒)static int sleep = 3000;private static void thread() throws InterruptedException {//循环1for (int index = 1; index < 5; index++) {System.out.println("任务:"+index);final int NO = index;Runnable run = new Runnable() {public void run() {//循环2for (int i = 1; i < 5; i++) {try {//打印iSystem.out.println("i="+i);//堵塞Thread.sleep(sleep);} catch (InterruptedException e) {e.printStackTrace();}//打印结果System.out.println("第" + NO + "次任务," + "第" + i + "次执行!");}// 递减,每次减一countDown.countDown();}};exec.submit(run);}// 等待线程全部执行完毕,确保程序的流程// 当递减为0时,执行countDown.await();// 关闭exec.shutdown();System.out.println("finish");}}

 运行结果

上一篇:java线程

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客