1. 程序,进程和线程基本概念。
程序:是计算机指令的集合,它以文件的形式存储在磁盘上。
进程:是一个程序在其自身的地址空间中的一次执行活动。
进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系
统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源。
线程:是进程中的一个单一的连续控制流程。一个进程可以拥有多个线程。
线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线
程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进
程简单。
2.创建线程的两种方法
(1) 用Thread类创建线程
要实现多线程,必须编写一个继承了Thread类的子类,子类要覆盖Thread类中的run函数,在子类的run函
数中调用想在新线程上运行的程序的代码。启动一个线程,调用Thread子类对象的start方法,Thread类对象的
start方法将产生一个新的线程,并在该线程上运行该Thread类对象中的run方法,根据面向对象的多态性,在该
线程上实际运行的是Thread子类对象中的run方法。例如,计算大于某一规定值的质数的线程可以写成:
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
然后,下列代码会创建并启动一个线程:
PrimeThread p = new PrimeThread(143); p.start();(2)使用Runnable接口创建多线程创建线程的另一种方法是声明实现Runnable
接口的类。该类然后实现run
方法。然后可以分配该类的实例,在创建Thread
时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:
class PrimeRun implements Runnable {long minPrime;PrimeRun(long minPrime) {this.minPrime = minPrime;}public void run() {// compute primes larger than minPrime. . .}}然后,下列代码会创建并启动一个线程:PrimeRun p = new PrimeRun(143); new Thread(p).start();实例:public class ThreadDemo{
public static void main(String args[]) {
TestThread tt = new TestThread();
//tt.start();
Thread t = new Thread(tt);
t.start();
while(true)
{
System.out.println("main thread is running");
}
}static class TestThread implements Runnable
{
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName()+" is running");
}
}
}
} (3)两种实现多线程方法的对比分析
实现Runnable接口相对于继承Thread类来说,有如下显著的好处:
a) 适合多个相同的程序代码的线程去处理同一资源的情况,把虚拟CPU同程序的代码,
较好的体现了面向对象的设计思想.
b)可以避免由于java的单继承特性带来的局限。当我们碰到这样的情况,即当我们要将已经继承了
某一个类的子类放入多线程中的时候,由于一个类不能同时有两个父类,所以不能用继承Thread类
的方式,那么这个类就只能采用实现Runnable接口的方式了。
c)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。