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
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");}}
运行结果:
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接