`
kxl8368
  • 浏览: 2375 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

学习java多线程时发现的一个困惑的现象(记录备查)

 
阅读更多

今天开始学习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左右的时候开始运行子线程,然后几乎就一直在执行子线程,一直到子线程运行结束后才开始运行主线程。

 

令我困惑的是,也许我这样中途获取子线程的方法不对,但我只是改变了获取返回值方法的位置,其他地方并没有改变,为什么线程的运行模式发生了这样的变化?多线程运行背后的机制原理到底是怎样的?是什么在影响线程的运行?有谁决定该哪个线程执行?

  • 大小: 279.7 KB
  • 大小: 16.8 KB
  • 大小: 286.8 KB
  • 大小: 294.7 KB
分享到:
评论

相关推荐

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    java多线程学习

    主要是结合课本和视频学习了一下java多线程的用法,这个专利适合于初学者学习多线程知识。

    java 多线程操作数据库

    一个java 多线程操作数据库应用程序!!!

    java多线程核心技术

    很多人学习完JavaSE/JavaEE之后想往更深入的技术进行探索,比如对大数据、分布式、高并发类的专题进行攻克时,立即遇到针对java.lang包中线程类的学习,但线程类的学习并不像JDBC一样简单,学习曲线陡峭,多弯路与...

    Java多线程编程经验

    线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 “同时”执行是人的感觉,在线程之间实际上轮换执行。...

    java多线程学习视频

    Java多线程是一块重要的内容,李兴华讲解的Java是一个很好的资源

    java多线程的讲解和实战

    详细的讲解了java多线程的原理,并配有代码进行实战,适合java初学者和想对多线程有进一步了解的人。

    多线程启动.java多线程启动.java多线程启动.java

    多线程启动.java多线程启动.java多线程启动.java多线程启动.java

    java多线程经典案例

    java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例

    java多线程学习java多线程学习.docx

    java多线程学习java多线程学习

    java多线程查询数据库

    java多线程并发查询数据库,使用线程池控制分页,并发查询。

    java多线程处理数据库数据

    java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。

    java多线程学习-ftp上传

    java多线程学习-ftp上传

    Java多线程知识点总结

    该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!

    JAVA多线程学习内容

    JAVA多线程学习,提高JAVA性能,多线程并列. JAVA高级学习内容。

    java多线程通信图解

    java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...

    java多线程进度条

    java多线程进度条

Global site tag (gtag.js) - Google Analytics