Java多线程技术



Java多线程技术.

多线程的优势:
减轻编写交互频繁,涉及面多的程序的困难(如监听网络端口)
程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以及其他外设)
多处理器系统可以并发运行不同的线程(否则,任何时刻只有一个线程在运行)

在JAVA中通过提供Thread类来实现多线程
在JAVA中线程由三部分组成:
虚拟CPU,封装在java.lang.Thread类中,控制整个线程的运行;
执行的代码,传递给Thread类,由Thread类控制顺序执行;
处理的数据,传递给Thread类,在代码执行过程中所要处理的数据

创建多线程的两种方法:继承Thread类、实现Runnable接口

Java中的线程是通过Thread类来实现的
生成一个Thread类的对象后,就产生一个线程,通过该对象实例,可以启动线程、种植线程、或者暂时挂起等

Thread类本身只是线程的虚拟CPU,线程所执行的代码通过方法run()(包含在一个特定的对象中,称为线程体)来完成
创建线程并初始化后,Java的运行时系统自动调用run()方法,实现线程所要完成的功能。

通常run()方法是一个循环,有时会执行一个时间较长的操作

要将一段代码在一个新的线程上运行,该代码应该在一个类的run()中,并且run()所在的类是Thread类的子类
要实现多线程,必须编写一个继承了Thread类的子类,子类要覆盖Thread类中的run(),在子类的run()中调用想在新线程上运行的程序代码

启动一个新的线程,不是直接调用Thread子类对象的run(),而是调用Thread子类对象的strat(),Thread类对象的start()将产生一个新的线程,并且该线程上运行该Thread子类对象中的run()


线程的代码段在run()中,该方法执行完以后,相应的线程结束,可以通过控制run()中的循环条件来控制线程的终止

每个线程都是通过类Thread定义,构造方法:
public Thread(ThreadGroup group,Runnable target,String name);
group :该线程所属的线程组
target:实际执行线程体的目标对象,必须实现接口Runnable
name :线程名
每个线程都有名字,当name为null时,则Java提供缺省名
当构造方法的某个参数为null时,可得到下面的几个构造方法:
public Thread();
public Thread(Runnable target);
public Thread(Runnable target,String name);
public Thread(String name);
public Thread(ThreadGroup group,Runnable target);
public Thread(ThreadGroup group,String name);

一个类声明实现Runnable接口就可以充当线程体,在接口Runnable中只定义了一个方法run():public void run();

任何实现接口Runnable的对象都可以作为一个线程的目标对象,类Thread本身也实现了接口Runnable,可以通过两种方法实现线程体
定义一个线程类,继承Thread并重写其中的方法run():
在初始化这个类的实例时,target可为null
由这个实例来执行线程体
用这种方法定义的类不能再继承其它父类
提供一个实现接口Runnable的类作为一个线程的目标对象:
初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体run()
实现接口Runnable的类仍然可以继承其它父类

每个线程都是通过某个特定Thread对象的方法run()来完成其操作的,方法run()称为线程体

创建状态(new Thread)
Thread myThread=new MyThreadClass();//线程处于创建状态
仅仅是一个空的线程对象,系统不为它分配资源

可运行状态(Runnable)
Thread myThread=new MyThreadClass();
myThread.strat();
当一个线程处于可运行状态时,系统为之分配所需的系统资源,安排其运行并调用线程运行方法
该线程也许实际上并未真正运行,并不是运行中状态(Running)
对于有单处理器的计算机,在同一时刻运行所有处于可运行状态的线程是不可能的,Java的运行系统必须调度这些线程共享处理器

不可运行状态(Not Runnable)
进入不可运行状态的原因:
调用了sleep()方法;
调用了suspend()方法;(挂起)
为等候一个条件变量,线程调用wait()方法;
输入输出流中发生线程阻塞;
也称为阻塞状态(Blocked)
由于某种原因(输入/输出、等待消息等),系统不能执行线程的状态。即使处理器空闲,也不能执行该线程

死亡状态(Dead)
线程的终止一般可通过两种方法实现:自然撤销(线程执行完)或是被停止(调用stop()方法)。目前不推荐通过调用stop()来终止线程的执行,而是让线程执行完