进程和线程
进程和线程都是一个控制流程。
一个进程通常对应一个程序
一个程序可以由多个不同的线程构成
进程是可用于资源的独立单位
进程同时又是一个可独立调度和分派的基本单位
线程因为具有许多进程所具有的特征,因此被称为轻量级进程。
线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。
线程不拥有系统资源,只拥有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。
线程可以创建和撤消,从而实现程序的并发执行。
线程的创建
在Java语言中,线程也是一种对象,但并非任何对象都可以成为线程,只有实现Runnable接口或继承了Thread类的对象才能成为线程。
Thread 类
Thread类中的主要的方法包括:
start()方法
interrupt()方法
join()方法
run()方法。
其中start()方法与run()方法最为常用,start()方法用于启动线程,run()方法为线程的主体方法,可以根据需要重写run()方法。每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
使用start()方法,线程进入Runnable(可运行)状态,它将向线程调度器注册这个线程。
调用start()方法并不一定马上会执行这个线程,正如上面所说,它只是进入Runnable 而不是Running。
注意,不要直接在程序中调用线程的run()方法。
简单举例:
Runnable接口
从本质上讲,Runnable是Java语言中用以实现线程的接口,任何实现线程功能的类都必须实现这个接口。
Thread类就是因为实现了Runnable接口,所以继承它的类才具有了相应的线程功能。
Runnable接口只有一个方法就是run()方法,实现Runnable()接口后必须实现run()方法。
2种线程方式的比较
使用Runnable接口
Runnable适合多个相同程序代码的线程去处理同一资源的情况。把虚拟CPU(线程)同程序的代码、数据有效的分离,较好的体现了面向对象的设计思想。
避免由于Java的单继承特性带来的局限性。也就是如果新建的类要继承其他类的话,因为JAVA中不支持多继承,就只能实现java.lang.Runnable接口。
有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
继承Thread类
不能再继承他类。
编写简单,可以直接操纵线程,无需使用Thread.currentThread()。
线程的状态图
线程的挂起
当一个线程进入“非可执行”状态,也就是挂起状态时,必然存在某种原因使其不能继续运行,这些原因可能是如下几种情况。
(1)通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。
(2)通过调用join()方法使线程挂起,如果线程A调用线程B的join()方法,那么线程A将被挂起,直到线程B执行完毕为止。
(3)通过调用wait()方法使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。
(4)线程在等待某个输入/输出完成。
与线程控制有关的方法
线程的优先级
多线程运行时需要定义线程运行的先后顺序
线程优先级是用数字表示,数字越大线程优先级越高,取值在(1到10)。默认优先级(为5)。
public class PriThread
{
public static void main(String args[ ])
{
ThreadA a=new ThreadA();
ThreadB b=new ThreadB();
a.setPriority(2);//设置优先级别,数值越大优先级越高
b.setPriority(8);
a.start();
b.start();
}
}
class ThreadA extends Thread
{
public void run()
{
System.out.println("我是线程A");
}
}
class ThreadB extends Thread
{
public void run()
{
System.out.println("我是线程B");
}
}
/*
因为在代码段当中我们把线程B的优先级设置高于线程A,所以运行结果先执行线程B的run()方法后再执行线程A的run()方法。
*/
结束线程
结束线程有两种情况:
(1)自然消亡:一个线程从run()方法的结尾处返回,自然消亡且不能再被运行;
(2)强制死亡:调用Thread类中stop()方法强制停止,不过该方法已经被废弃。
虽然这两种情况都可以停止一个线程,但最好的方式是自然消亡,简单地说,如果要停止一个线程的执行,最好提供一个方式让线程可以完成run()的流程。
例如:线程的run()方法中执行一个无限循环,在这个循环中可以提供一个布尔变量或表达式来控制循环是否执行,在线程执行中,可以调用方法改变布尔变量的值,用这种方式使线程离开run()方法以终止线程。