多线程-Thread、Runnable、Callbale、Future
2024-09-04 11:08:18
Thread:java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类,可以通过继承Thread类来创建并启动多线程。
package org.github.lujiango; public class Test10 { static class MyThread extends Thread {
@Override
public void run() {
System.out.println("I am extend Thread...");
}
} public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
} }
Runnbale:可以通过实现Runnable接口来创建多线程,创建Runnable实现类的实例,并以此作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
package org.github.lujiango; public class Test11 { static class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("I am implement Runnable...");
}
} public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start();
} }
Callable:从Java 5开始,Java提供了Callable接口,提供了一个call方法可以作为线程执行体,但是call方法可以有返回值,可以声明抛出异常。Java5提供了Future接口来代表call方法的返回值,并为Future提供了一个FutureTask实现类,该实现类实现了Future和Runnable。
package org.github.lujiango; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; public class Test12 { static class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "my callable";
}
} public static void main(String[] args) throws InterruptedException, ExecutionException {
MyCallable callable = new MyCallable();
FutureTask<String> future = new FutureTask<String>(callable);
new Thread(future).start();
System.out.println(future.get()); } }
创建线程的三种方式比较:
通过继承Thread类或实现Runnable,Callable接口都可以实现多线程。
采用Runnable,Callable接口的方式创建多线程
(1)线程类只是实现了Runnable接口或Callable接口,还可以继承其它类。
(2)多线程可以共享一个target对象,所以合适多个相同线程来处理同一份资源的情况,从而可以将CPU,代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。
(3)编程稍微复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法
采用继承Thread类的方法创建多线程
(1)因为多线程类已经继承了Thread类,所以不能在继承其它父类。
(2)编写简单,如果需要访问当前线程,则无须使用Thread.currentThread()方法,直接使用this即可获得当前线程。
最新文章
- ViewController的生命周期分析和使用
- dynamoDb aws config aws_access_key_id aws_secret_access_key golang
- windows下CMake使用图文手册 Part 2
- [Reomting Debug] 巧用VS 的remote debug 功能远程调试程序 经验分享.
- JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-003映射实体时的可选操作(<;delimited-identifiers/>;、PhysicalNamingStrategy、PhysicalNamingStrategyStandardImpl、、、)
- Json.net/Newtonsoft 3.0 新特性JObject/Linq to Json
- 深度优先算法DFS
- EF4 Code First和EF6 Code First链接mysql的方法
- 《Effective C#中文版:改善C#程序的50种方法》读书笔记
- webpack入门与解析(一)
- Recycleview实现复杂布局
- MySql concat与字符转义
- XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件
- SDN概述:简介、工具、环境部署
- Cross-site request forgery 跨站请求伪造
- MySQL导入导出表数据
- vue微信分享链接添加动态参数
- HBase入门基础教程之单机模式与伪分布式模式安装(转)
- install ros-indigo-laser-geometry
- CF1012C Hills 题解【DP】