一、线程概述以及Java的线程模型
线程是程序执行流的最小单位。
每个线程都是作为利用CPU的基本单位。
每个JAVA应用程序都至少有一个线程—主线程。当一个JAVA应用程序启动时,JVM会创建主线程,并在该线程中调用程序的main()方法。
多线程与多进程的区别。
多线程是多进程的细化更深入一步。
通常在一个进程中可以包含多个线程,它们可以利用进程拥有的资源。
Java语言中,多线程的机制是通过虚拟CPU来实现的。可以形象地理解为,在一个Java程序内部虚拟了多台计算机,每台计算机对应一个线程,有自己的CPU。
每个Java应用程序都至少有一个线程,这就是所谓的主线程。它由JVM创建并调用Java应用程序main()方法。
JVM还通常会创建一些其他的线程,这些都是对我们不可见的。比如自动垃圾收集的线程,对象终止或者其他的与JVM处理任务相关的线程。
二、创建线程
创建线程的三种方法
1、建立一个类继承自Thread,重写父类的run()方法,并在里面编写逻辑。
代码如下:
class myThread extends Thread{
@Override
public void run()
{
//处理具体的逻辑
}
}
其中方法run()称为线程体。
创建该类的实例并对其使用start()方法可使其进入Runnable(可运行)状态。示例:new myThread().start();
调用start()方法并不一定马上会执行这个线程,只是进入Runnable而非Running状态。
注意:不要直接在程序中调用线程的run方法。因为可能存在线程等待的情况。直接调用容易造成死锁。
2、实现Runnable接口创建线程。
class myThread implements Runnable{
@Override
public void run()
{
//处理具体逻辑
}
}
启动方法:new Thread(new myThread()).start();
3、匿名内部类
new Thread(new Runnable(){
//具体逻辑
}).start();
三、后台线程概念。
在后台运行,为其他的线程提供服务。典型:定时器(Timer)
后台线程常用于任务结束时的善后处理。后台线程的优先级要比其他线程低。
和后台线程相对的其他线程,一般被称为用户线程。如果一个应用中只有后台线程在运行,JVM将退出该应用程序。
可以通过setDaemon(boolean true)将一个普通线程设置为后台线程。用方法isDaemon()可以测定特定的线程是否为后台线程。
public class DaemonThread extends Thread{
public void run()
{
while(true)
{
System.out.println("Daemon thread running");
}
}
public static void main(String agrs[]){
DaemonThread dh=new DaemonThread();
dh.setDaemon(true);//1
dh.start();
}
}
上面的程序运行一段时间后会自动退出,而删去//1这行之后就不会自动退出。