今天开始学习JAVA的多线程编程,在学到使用Callable接口和Future创建线程的时候,对书本的例程进行了小小的修改后,运行结果让我有点困惑,先记录下来,再学完整章之后看能否找到答案。
书上的例程如下:
//实现Callable接口的线程 class ThirdThread implements Callable<Integer> { public Integer call() { int i = 0; for( ; i<100; i++) { System.out.println(Thread.currentThread().getName() + "的循环变量i的值:" + i); } return i; } } public class FirstThread extends Thread { public static void main(String[] args) { //创建Callable对象 ThirdThread rt = new ThirdThread(); //用FutureTask来包装Callable对象 FutureTask<Integer> task = new FutureTask<>(rt); for(int i=0; i<100; i++) { System.out.println(Thread.currentThread().getName() + "的循环变量的值:" + i); if(i==20) { new Thread(task, "有返回值的线程").start(); } } try { System.out.println("子线程的返回值:" + task.get(10, TimeUnit.SECONDS)); } catch (Exception ex) { ex.printStackTrace(); } } }
程序的运行结果如下:
可以看到在main主线程运行到20的时候,子线程启动,之后主线程和子线程交替执行,并且在最后返回子线程的值100。
为了加深理解,我自己对程序进行了小小的修改,将try语句块放到了main方法的for循环体内,并加上了执行条件,希望每循环5次就输出一次子线程的值,程序改动的部分如下:
//main方法内部 //..... for(int i=0; i<100; i++) { System.out.println(Thread.currentThread().getName() + "的循环变量的值:" + i); if(i==20) { new Thread(task, "有返回值的线程").start(); } if(i > 20 && i % 5 == 0) { try { System.out.println("子线程的返回值:" + task.get(10, TimeUnit.SECONDS)); } catch (Exception ex) { ex.printStackTrace(); } } } //.....其他代码
然后执行,结果如下:
不仅没有实现我想实现的目的,而且线程竟然也不是交替进行的了,每次几乎都是在主线程运行到25左右的时候开始运行子线程,然后几乎就一直在执行子线程,一直到子线程运行结束后才开始运行主线程。
令我困惑的是,也许我这样中途获取子线程的方法不对,但我只是改变了获取返回值方法的位置,其他地方并没有改变,为什么线程的运行模式发生了这样的变化?多线程运行背后的机制原理到底是怎样的?是什么在影响线程的运行?有谁决定该哪个线程执行?
相关推荐
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
主要是结合课本和视频学习了一下java多线程的用法,这个专利适合于初学者学习多线程知识。
一个java 多线程操作数据库应用程序!!!
很多人学习完JavaSE/JavaEE之后想往更深入的技术进行探索,比如对大数据、分布式、高并发类的专题进行攻克时,立即遇到针对java.lang包中线程类的学习,但线程类的学习并不像JDBC一样简单,学习曲线陡峭,多弯路与...
线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 “同时”执行是人的感觉,在线程之间实际上轮换执行。...
Java多线程是一块重要的内容,李兴华讲解的Java是一个很好的资源
详细的讲解了java多线程的原理,并配有代码进行实战,适合java初学者和想对多线程有进一步了解的人。
多线程启动.java多线程启动.java多线程启动.java多线程启动.java
java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例
java多线程学习java多线程学习
java多线程并发查询数据库,使用线程池控制分页,并发查询。
java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。
java多线程学习-ftp上传
该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!
JAVA多线程学习,提高JAVA性能,多线程并列. JAVA高级学习内容。
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...
java多线程进度条