一.线程的创建和启动
java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每条线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序流的代码)。Java使用run方法来封装这样一段程序。
1.继承Thread类创建线程类
总结:从上面结果可以看出Thread-0和Thread-1两条线程输出的i变量都不连续(注意:i变量是FirestThread的实例属性,而不是局部变量,但因为程序每次创建线程都会创建一个FirstThread对象,所以Thread-0和Thread-1不能共享该实例属性)。
使用继承Thread类的方法来创建线程类,多条线程之间无法共享线程类的实例变量。
2.实现Runnable接口创建线程类
总结:根据源代码中Thread类构造方法Ruanalbe接口对象target只能作为参数传递到Thread构造方法中,所以多个线程可以共用一个Runnable对象,因为都用同一个Runnable对象所以在Runnable实现类的实例变量也可以共享了。
所以Runable非常适合多个相同线程来处理同一份资源的情况。
二.线程的生命周期
1.New新建:当线程被创建时,该线程处于新建状态,此时它和其他java对象一样,仅仅由Java虚拟机为其分配了内存,并初始化了其成员变量的值。(此时的线程没有表现出任何表现出任何线程的动态特征,程序也不会执行线程的线程执行体)newThread()||newThread(Runnabletarget,Stringname)。
2.Runnable就绪:就绪也就是说启动线程,但是启动线程使用start方法,而不是run方法!永远不要调用线程对象的run()方法!调用start方法来启动线程,系统会将该run方法当成线程执行体来处理。如果直接调用线程对象的run方法。则run方法会立即执行,且在这个run方法的执行体未执行结束前其他线程无法并发执行(即系统会将run方法当做一个普通对象的普通方法,而不是线程执行体对待)
附1:如果有一个主线程,一个子线程。当根据逻辑代码该调用子线程时不一定会立即调用,为了想在子线程start()后立即调用子线程,可以考虑使用Thread.sleep(1),这样会让当前线程(主线程)睡眠1毫秒,因为cpu在这1毫秒中是不会休息的,这样就会去执行一条处于就绪状态的线程。
附2:不能对已经处于就绪状态的线程,再次使用start()
3.Running运行:当处于就绪状态时,该线程获得cpu,执行体开始运行,就处于运行状态了。
4.Blocked阻塞:线程不可能一直处于运行状态(线程执行体足够短,瞬间就可以完成的线程排除),线程会在运行过程中需要被中断,因为是并发,目的是会让其他线程获得执行的机会,线程的调度细节取决于OS采用的策略。(抢占式调度xpwin7linuxunix..)。如果是一些特殊的小型设备可能采用协作式调度(只有线程自己调用它的sleep()或yield()才会放弃所占用的资源)。
5.Dead死亡:根据上图所示。测试测试某条线程是否已经死亡,可以调用线程对象的isAlive()方法,当线程处于就绪,运行,阻塞时,返回true。线程处于新建,死亡时返回false。
不能对已经死亡的线程调用start()方法使它重新启动,死亡就是死亡,是不能再次作为线程执行的。
当主线程结束时候,其他线程不受任何影响,并不会随之结束。一旦子线程启动起来后,它就拥有和主线程相同的地位,它不会受到主线程的影响。
三.控制线程
1.join线程:
让一个线程等待另一个线程完成的方法:join()。当在某个程序执行流中调用其他线程的join()方法,那该执行流对应的线程就会阻塞,知道被join()加入的join线程完成为止。join方法通常有使用线程的程序调用,将大问题划分成许多小问题,每个小问题分配一个线程。当所有的小问题都得到处理后,再调用主线程来进一步操作(Threadt=newThread();t.start();t.join简单来说就是加入到t线程。等t线程执行完成后才会返回出来执行线程。)
Join方法有三种重用形式:
Join():等待被join的线程执行完成
Join(longmillis):等待join线程的时间最长为millis毫秒,如果在这个时间内,被join的线程还没有执行结束则不再等待)
Join(longmillis,intnanos)千分之一毫秒(不用)
Code:
2.后台线程:
Code:
3.线程睡眠:sleep
4.线程让步(yield)
总结:sleep和yield区别
A.sleep方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级。而yield只会给优先级>=当前优先级的线程执行机会
B.Sleep方法会将线程转入阻塞状态,知道经过阻塞时间才会转入就绪状态。而yield是不会将线程转入阻塞状态的,它只是强制当前线程进入就绪状态。
C.Sleep会抛出InterruptedException异常。而yield没有声明任何异常
D.Sleep方法比yield方法有更好的移植性。
E.通常不依靠yield来控制并发线程控制
分享到:
相关推荐
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...
java学习笔记2(多线程)java学习笔记2(多线程)
多线程学习笔记,通过平时的学习所做的一些笔记,希望对广大同仁有所帮助
NULL 博文链接:https://baobeituping.iteye.com/blog/1190260
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
这篇文档和对应的源代码 博文链接:https://interper56-sohu-com.iteye.com/blog/172303
java学习笔记5(java多线程)java学习笔记5(java多线程)
多线程学习笔记,好资源。包括线程基础等知识多线程学习笔记,好资源。包括线程基础等知识
Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...
多线程学习笔记 包含doc文档笔记加笔记中出现的代码(博文地址共上中下)http://blog.csdn.net/cloudyxuq/article/details/6941404
Java分布式应用学习笔记05多线程下的并发同步器
张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。
线程的基本概念 线程的创建和启动 线程的调度和优先级 线程的状态控制 线程同步
JUC学习笔记(Java多线程)
JAVA多线程学习笔记整理(csdn)————程序
java多线程学习笔记02(csdn)————程序
学习目录:1. 线程简介 2. 线程实现(重点) 3. 线程状态 4. 线程同步(重点) 5. 线程通信问题 6. 高级主题
java多线程编程笔记,本人亲自整理的,适合于初学java的同学们,相信通过努力学习我们一定会对java有个初步的了解
Linux面试专题及答案+ActiveMQ消息中间件面试专题+Java基础面试题+MySQL性能优化的21个最佳实践+微服务面试专题及答案+深入理解java虚拟机+设计...专题及答案+java多线程并发编程知识导图笔记+Java并发体系知识导图笔记...