new Thread() {
public void run() {
System.out.println(“直接使用Thread创建”);
};
}.start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(“传入Runnable创建”);
}
}).start();
原理:
2.Callable方式
FutureTask task1 = new FutureTask(new Callable(){
public String call(){
return “线程实现方式”;
}
});
Thread thread = new Thread(task1);
thread.start();
try {
System.out.println(task1.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
a.使用线程实现方式
主要是将Callable的实例对象通过FutureTask包装了一下,可以看下FutureTask中构造方法的源码
FutureTask 实现RunnableFuture接口,而RunnableFuture接口继承Runnable, Future接口
因此FutureTask可以包装的Callable的实例中的call()在run()中执行,所以这种方式就等于将Runnable实现的子类实例放入到Thread的构造方法中,子类的run()方法正好是重写里面调用call();
public void run() {
if (state != NEW ||
!UNSAFE.compareAndSwapObject(this, runnerOffset,
null, Thread.currentThread()))
return;
try {
Callable c = callable;
if (c != null && state == NEW) {
V result;
boolean ran;
try {
result = c.call();
ran = true;
} catch (Throwable ex) {
result = null;
ran = false;
setException(ex);
}
if (ran)
set(result);
}
} finally {
// runner must be non-null until state is settled to
// prevent concurrent calls to run()
runner = null;
// state must be re-read after nulling runner to prevent
// leaked interrupts
int s = state;
if (s >= INTERRUPTING)
handlePossibleCancellationInterrupt(s);
}
}
另外,FutureTask的构造方法传入的参数除了Callable之外也支持Runnable,它的操作主要是将Runnable实现的子类通过RunnableAdapter转化为Callable,源码如下
public FutureTask(Runnable runnable, V result) {
this.callable = Executors.callable(runnable, result);
this.state = NEW; // ensure visibility of callable
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!