参考书:疯狂java讲义,java程序设计基础。java
1新建状态(newborn)当一个Thread类或者其子类的对象被声明或者是建立,但没有执行的这段状态称为新建状态。dom
2.就绪状态(runnable)就绪状态也称为可运行状态。处于新建状态的线程被启动后,将进入线程列队排队等候cpu的调度,此时具有了运行的条件,也就是就绪状态。学习
3.运行状态(Runing)就绪状态的线程得到cpu的调度并得到系统资源后便进入了运行状态。线程
处于运行状态的线程在一下状况下将让出cpu的控制权设计
●线程运行完毕。code
●有比当前优先级更高的线程处于就绪状态。对象
●线程主动睡眠一段时间。继承
●线程正在等待某一资源。接口
4.阻塞状态(blocked)一个运行的线程在某些特殊的状况下将让出cpu,并暂时停止本身的执行。线程处于这种不可运行的状态称为阻塞状态。下面几种状况下可使一个线程进入阻塞状态。队列
●调用sleep()或者yield()方法。
●等待一个条件变量线程调用wait()方法。
●该线程与另外一个线程join()在一块儿。
一个线程被阻塞时不能进入排队队列,阻塞的缘由被消除时才能进入就绪状态。阻塞状态的线程一般须要某些事件才能唤醒,睡眠状态的线程必须阻塞一段固定时间。
5.消亡状态(dead)处于消亡状态的线程不具有继续执行的能力,致使线程消亡的缘由有两个:一是执行了run()方法的最后一条语句,二是进程中的线程被强制终止。
线程的调度与优先级:java语言支持抢占调度模型,每一个线程都被赋予一个执行的优先级。从1到10整数型。Thread类有三个优先级的静态变量MIN_PRIORITY(1),MAX_PRIORITY(10),NORM_PRIORITY(5)。
建立线程:
经过继承Thread类来建立线程的步骤以下。
1.定义Thread类的子类并重写该类的run方法。该run()方法体称为线程执行体。
2.建立Thread类的子类实列,即建立线程对象。
3.调用线程对象的start()方法。
package Test; class MyThread extends Thread { private String who; public MyThread(String str) { who=str; } public void run() { for(int i=0;i<5;i++) { try { sleep((int)(1000*Math.random())); } catch(InterruptedException e) { } System.out.println(who+"正在运行"); } } } public class App11_1 { public static void main(String[] args) { MyThread you=new MyThread("你"); MyThread she=new MyThread("她"); you.start(); she.start(); System.out.println("主方法main运行结束"); } }
主方法main运行结束
她正在运行
你正在运行
她正在运行
你正在运行
她正在运行
你正在运行
你正在运行
你正在运行
她正在运行
她正在运行
--------------------------------------------------------
实现Runnable借口建立线程:
●定义Runnable借口实现类,并重写Run方法,该Run()方法一样是线程的执行体。
●建立借口实现类的实例,并以实例做为Thread类的参数。该Thread对象才是真正的线程对象。
package Test; class MyThread_ implements Runnable { private String who; public MyThread_(String str) { who=str; } public void run() { for(int i=0;i<5;i++) { try { Thread.sleep((int)(Math.random()*1000));//注意sleep方法是Thread类的 } catch(InterruptedException e) { } System.out.println(who+"正在运行"); } } } public class App11_2 { public static void main(String[] args) { MyThread_ you=new MyThread_ ("你"); MyThread_ she=new MyThread_("她"); Thread a=new Thread(you); Thread b=new Thread(she); a.start(); b.start(); System.out.println("Main方法执行完毕"); } }
使用callable和Future建立线程。
建立并启动有返回值的线程步骤以下。
1.建立callable接口实现类,并实现call()方法,该call()方法将作线程的执行体,且该call()方法有返回值。
2.建立Callable实现类的实列,使用FutureTask类来包装Callable对象,该FutureTask对象封装该Callable对象的call()方法的返回值。
3.使用FutureTask对象做为Thread对象参数建立并启动线程。
4.调用FutureTask对象的get()方法来得到子线程执行结束后的返回值。
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class ThirdThread implements Callable<Integer> { //实现call()方法,实现线程执行体 public Integer call() { int i=0; for( ;i<100; i++) { System.out.println(Thread.currentThread().getName()+"的循环变量i的值:"+i); } return i; } public static void main(String[] args) { ThirdThread rt=new ThirdThread(); //使用FutureTask类来包装Callable对象。 FutureTask<Integer> task= new FutureTask<Integer>(rt); for(int i=0;i<100;i++) { System.out.println(Thread.currentThread().getName()+"的循环变量i的值:"+i); if(i==20) { //实际仍是以Callable来建立对象。并启动线程。 new Thread(task,"有返回值的线程").start(); } try { System.out.println("子线程的返回值:"+task.get()); } catch(Exception e) { } } } }
学习笔记,若有错误欢迎指正