Java线程
一、进程与线程
进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,即进程空间或(虚空间)。进程不依赖于线程而独立存在,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。
线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,线程没有自己的虚拟地址空间,与进程内的其他线程一起共享分配给该进程的所有资源。
二、线程实现方式
(一)继承 Thread 类
public class Thread01 extends Thread {
public static void main(String[] args) {
Thread01 thread = new Thread01();
thread.start();
}
@Override
public void run() {
System.out.println("这是一个继承Thread类的线程");
}
}
(二)实现Runnable接口
public class Runnable01 implements Runnable {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable01());
thread.start();
}
@Override
public void run() {
System.out.println("这是一个实现Runnable接口的线程");
}
}
(三)实现Callable接口
public class Callable01 implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask future = new FutureTask(new Callable01());
new Thread(future).start();
System.out.println(future.get());
}
@Override
public String call() {
return "这是一个实现Callable接口的线程";
}
}
(四)Runnable接口相比继承Thread类的优势
1、可以避免由于java的单继承特性带来的局限性
2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的
3、线程池只能放入事先Runnable或者Callable类线程,不能放入继承Thread的类
(五)实现Runnable接口和实现Callable接口的区别
1、Runnable是java1.1就有了,而Callable是1.5之后才加入的
2、实现Callable接口的任务线程可以返回执行结果,而实现Runnable的线程不能返回结果
3、Callable接口的call()方法允许抛出异常,而Runnable接口的run()方法的异常只能在内部消化,不能继续往上抛
4、加入线程池运行,Runnable 使用 ExecutorService 的 execute 方法,Callable 使用 submit 方法
注:Callable 接口支持返回执行结果,此时需要调用 FutureTask.get()方法实现,此方法会阻塞主线程直到获
取返回结果,当不调用此方法时,主线程不会阻塞
三、线程的生命周期
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。
- 新建:就是刚使用new方法,new出来的线程;
- 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
- 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
- 阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
- 销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;
如果需要更加详细的了解可以点击查看;
--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------
--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------