线程的理解:要理解线程,首先要理解进程的概念。进程为程序提供了一种错觉,好像这个计算机上只有这个程序在运行。而进程和程序的概念是不同的,程序说得直白一点,就是存储在硬盘上的二进制数据,而进程是程序已经被加载到内存中了,此时它在内存中占用一定的寄存器和内存空间,进程通常还包含其它的资源比如程序的状态、打开的文件等等。进程中如果存在多个执行流,那么每个顺序执行流就是一个线程。
线程的特点:线程组成了进程,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程可以与父进程中其他线程共享父进程中的共享变量以及部分环境。线程的调度是由进程本身完成的。
多线程应用举例:一个浏览器下载多个图片,一个Web服务器响应多个用户请求。
Java中多线程的的创建:
一、继承Thread类创建线程类:
public class FitstThread extends Thread{
private int i;
public void run() {
for(; i < 100 ; i++) {
System.out.println(getName() +" "+i);
}
}
public static void main(String [] args){
for(int i = 0 ; i < 100 ; i++){
System.out.println(Thread.currentThread().getName()
+" "+i);
if(i == 20 ){
new FirstThread().start();
new FirstThread().start();
}
}
在run()方法中使用的变量i是FirstThread的实例变量,所以线程不能够共享该实例变量。
二、
实现Runnable接口创建线程类
public class SecondThread implements Runnable{
private int i;
public void run() {
for(; i < 100 ; i++){
System.out.println(Thread.currentThread().getName()
+" "+i);
}
}
public static void main(String [] args){
for(int i = 0 ; i < 100 ; i++){
System.out.println(Thread.currentThread().getName()+" "+i);
if(i == 20 ){
SecondThread st = new SecondThread();
new Thread(st,"new1").start();
new Thread(st,"new2").start();
}
}
}
}
上面两个子线程共享线程类的实例变量i,在这种情况下程序创建的Runnable的对象只是线程的target,而多个线程共享一个target,所以多个线程可以共享一个线程类的实例变量。