创建线程的方式

简介: 本章讲解了四种创建线程的方式

创建线程有哪几种方式?

  • 通过扩展 Thread 类来创建多线程
  • 通过实现 Runnable 接口来创建多线程
  • 实现 Callable 接口,通过 FutureTask 接口创建线程。
  • 使用 Executor 框架来创建线程池。

继承 Thread 创建线程:

代码如下。run()方法是由jvm创建完操作系统级线程后回调的方法,不可以手动调用,手动调用相当于调用普通方法

publicclassMyThreadextendsThread {
publicMyThread() {
            }
@Overridepublicvoidrun() {
for (inti=0; i<10; i++) {
System.out.println(Thread.currentThread() +":"+i);
                }
            }
publicstaticvoidmain(String[] args) {
MyThreadmThread1=newMyThread();
MyThreadmThread2=newMyThread();
MyThreadmyThread3=newMyThread();
mThread1.start();
mThread2.start();
myThread3.start();
            }
        }

Runnable 创建线程代码:

publicclassRunnableTest {
publicstaticvoidmain(String[] args){
Runnable1r=newRunnable1();
Threadthread=newThread(r);
thread.start();
System.out.println("主线程:["+Thread.currentThread().getName()+"]");
            }
        }
classRunnable1implementsRunnable{
@Overridepublicvoidrun() {
System.out.println("当前线程:"+Thread.currentThread().getName());
            }
        }

实现Runnable接口比继承Thread类所具有的优势:

1. 可以避免java中的单继承的限制

2. 线程池只能放入实现RunableCallable类线程,不能直接放入继承Thread的类

Callable 创建线程代码:

publicclassCallableTest {
publicstaticvoidmain(String[] args) {
Callable1c=newCallable1();
//异步计算的结果FutureTask<Integer>result=newFutureTask<>(c);
newThread(result).start();
try {
//等待任务完成,返回结果intsum=result.get();
System.out.println(sum);
                } catch (InterruptedException|ExecutionExceptione) {
e.printStackTrace();
                }
            }
        }
classCallable1implementsCallable<Integer> {
@OverridepublicIntegercall() throwsException {
intsum=0;
for (inti=0; i<=100; i++) {
sum+=i;
                }
returnsum;
            }
        }

使用 Executor 创建线程代码:

publicclassExecutorsTest {
publicstaticvoidmain(String[] args) {
//获取ExecutorService实例,生产禁用,需要手动创建线程池ExecutorServiceexecutorService=Executors.newCachedThreadPool();
//提交任务executorService.submit(newRunnableDemo());
            }
        }
classRunnableDemoimplementsRunnable {
@Overridepublicvoidrun() {
System.out.println("大彬");
            }
        }


相关文章
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
2035 0
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
12月前
|
安全 Java 测试技术
Java“AccessControlException”解决
Java中的“AccessControlException”通常发生在尝试访问受限资源时,如文件或网络。解决方法包括:确保所需权限已授予,检查安全策略配置,使用doPrivileged块执行敏感操作。调整策略文件或代码以匹配实际需求。
591 1
|
JavaScript 前端开发 关系型数据库
Node.js 连接 MySQL
Node.js 连接 MySQL
167 5
|
监控 安全 网络安全
|
11月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
204 2
|
开发框架 监控 Kubernetes
CTF本地靶场搭建——GZ:CTF基础使用
GZ::CTF是一个基于ASP.NET Core的开源CTF竞赛平台,支持Docker或K8s容器部署,提供静态和动态题目类型,包括静态附件、动态附件、静态容器和动态容器,具备动态分值功能,如三血奖励和动态flag作弊检测。平台还具有实时通知、邮件验证、用户权限管理、Writeup收集、流量代理转发等功能。此外,它包含比赛管理、队伍管理、用户管理等多个管理模块,适合举办和参与网络安全竞赛。
|
存储 缓存 编译器
探秘C++中的神奇组合:std--pair的魅力之旅
探秘C++中的神奇组合:std--pair的魅力之旅
794 1
探秘C++中的神奇组合:std--pair的魅力之旅
|
存储 人工智能 Cloud Native
阿里云向量检索服务测评:高效、易用、强大的向量管理与查询能力
摘要:本文对阿里云向量检索服务进行了全面的测评,从其基于自研Proxima内核的高性能、全托管、云原生特性,到简洁易用的SDK/API接口,再到在多种应用场景下的集成能力,为读者提供了一个全面了解阿里云向量检索服务的机会。
1317 0
|
算法 C语言
【数据结构】二叉树的层序遍历(四)
【数据结构】二叉树的层序遍历(四)
123 0