[JDK8] Java单线程框架实现原理

Java单线程有三种实现方法

  1. 继承Thread类,重写run(),无返回值
  2. 实现Runnable接口,重写run(),无返回值
  3. 实现Callable<V>接口,重写call()方法,有返回值

Java的单线程框架

这三种实现方式都是套用的一个线程框架,以下是简化的Thread类源码:

// 线程任务定义接口
public interface Runnable {
    public abstract void run();
}

// 线程类实现(源码简化版)
public class Thread implements Runnable {
	private Runnable target;// 线程任务

	public Thread() {
	}

	public Thread(Runnable target) {
		this.target = target;
	}

	@Override
	public void run() {
		if (target != null) {
			target.run();
		}
	}

	public synchronized void start() {
		start0();
	}

	// native方法由JVM底层C++实现,负责线程资源分配并启动
	// 线程运行起来以后,会调用Java线程对象的run()方法执行线程任务
	private native void start0();
}

第一种方法:继承Thread类

这种方法的实现原理是利用面向对象编程的三大特性之一:

继承

通过继承父类Thread重写run()方法,达到线程任务的具体化。

public class MyThread extends Thread {
	@Override
	public void run() {
		System.out.println("重写框架的线程任务调用逻辑");
	}

	public static void main(String[] args) {
		new MyThread().start();
	}
}

第二种方法:实现Runnable接口

这种方法才是单线程Thread的框架本意,通过Thread构造方法接收线程任务,然后运行自身定义好的run()方法逻辑,执行线程任务。

public class MyRunnable implements Runnable {
	@Override
	public void run() {
		System.out.println("实现具体的线程任务");
	}

	public static void main(String[] args) {
		new Thread(() -> System.out.println("线程任务")).start();
	}
}

第三种方法:实现Callable接口

这种方法与前两种方法最大的区别就是有返回值,启动线程并执行任务的代码途径与第二种方法一样,只是多了一层FutureTask封装,而FutureTask也是一个Runnable的实现,多这一层的目的就是为了线程任务的返回值

public class MyCallable implements Callable<String> {
	@Override
	public String call() throws Exception {
		System.out.println("任务实现");
		return "线程执行结果";
	}

	public static void main(String[] args) throws ExecutionException, InterruptedException {
		FutureTask<String> task = new FutureTask<>(new MyCallable());
		new Thread(task).start();
		String result = task.get();// 阻塞当前线程,等待返回值
		System.out.println(result);
	}
}

task.get()会阻塞当前线程,直到线程任务执行完毕,可以拿到返回值,或者线程任务执行出错,抛出异常。

至于task.get()的阻塞原理,又是另一个问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值