线程介绍
线程和进程
进程就是计算机中正在进行的一个独立的应用程序,进程是一个动态的概念必须是一个进行状态,如果一个应用没有启动,那么就不是进程;
线程就是组成进程的基本单元,可以完成特定的功能,一个进程可以有多个线程组成。
区别:
- 内存空间上的区别:进程是独有的内存空间,每个进程之间是相互独立的,互不影响;线程是有共享的内存空间(也有私有空间)
- 安全性:进程是相互独立的,一个进程的崩溃不会影响到其他的进程,进程是安全;
- 线程存在内存空间共享,一个线程的崩溃可能影响到其他的线程的执行,线程的安全性不如进程。
关系: 进程是相互独立的,一个进程下可以有一个或者多个线程。
Java中很少使用进程概念,但也可以使用:
//java中创建进程的方式
Runtime runtime = Runtime.getRuntime();
Java启动线程
private native void start0();
native方法会调用底层操作系统支持,Java本身是没办法启动线程的,线程启动是需要依赖底层操作系统支持的,Java调用native方法,调用底层操作系统C++编写的动态函数库,有C++去操作底层启动线程。Java是间接的调用来启动线程
线程创建方式
- 继承thread类
- 实现Runable接口
- 实现Callable接口
实现Runable接口
Runable接口定义如下:
public interface Runable{
//抽象的run方法
public abstract void run();
}
Runable接口中提供了一个抽象的run方法,实现Runable接口实现run方法
Runnable实现方式:
/**
* 通过实现Runable接口来实现run方法
*/
public class RunableDemo implements Runnable {
@Override
public void run(){
System.out.println("线程名:" + Thread.currentThread().getName()+"线程在执行");
}
}
RunableDemo runableDemo = new RunableDemo();
Thread thread = new Thread(runableDemo);
//当前才会创建子线程
thread.start();
Runnable实现类是任务,Thread类是线程对象,线程是用来执行任务的
实现Runnable的线程创建的步骤∶
- 创建一个实现Runnable接口的实现类,并实现run方法
- 实例化Runnable接口实现类
- 创建Thread类实例,将实例化Runnable接口实现类作为参数传递
- 启动子线程,调用Thread类和实例的start
继承Thread类
Thread类的定义
public class Thread implements Runnable
可以看出:Thread类实现了Runnable接口,即Thread类也是Runnable接口实现类,在Thread中也有run方法的实现
public void run() {
if (target != null) {
target.run();
}
}
Thread类中的run方法的实现中,target任务体不能为空,即调用run方法,需要通过Thread类来重写run方法
继承Thread类来使用Demo
/**
* 通过继承Thread类来重写run方法
*/
public class ThreadDemo extends Thread {
@Override
public void run(){
System.out.println("ThreadDemo类 线程名:"+Thread.currentThread().getName()+"在执行");
}
//第二种:通过继承Thread类来创建线程
ThreadDemo threadDemo = new ThreadDemo();
threadDemo.start();
继承Thread类创建线程步骤:
- 创建类,继承Thread重写run方法
- 实例化当前创建的Thread类的子类
- 启动子线程、调用start方法
实现Callable接口
Callable接口声明如下:
public interface Callable<V> {
V call() throws Exception;
}
Callable接口提供了call方法,具有返回值,通过泛型来定义,该接口可以抛出异常
该接口的实现类是无法直接使用,需要借助于FutureTask类
public class FutureTask<V> implements RunnableFuture<V> {
public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
this.callable = callable;
this.state = NEW; // ensure visibility of callable
}
}
RunnableFuture接口声明
public interface RunnableFuture<V> extends Runnable, Future