java 多线程的三种构建方法

继承Thread类创建线程类
public class Thread extends Object implements Runnable
public class FirstThread extends Thread {
public void run(){
for(int i=0;i<100;i++){
/*
* Thread类已经继承了Object
* Object类创建了name选项 并且有其getName(),setName()方法
* 在继承Thread的类里面使用时只需要用this引用
*/
System.out.println(this.getName()+" "+i);
}
}
public static void main(String[] args) {
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20){
new FirstThread().start();
new FirstThread().start();
}
}
}
}
Thread类已经继承了Object
Object类创建了name选项 并且有其getName(),setName()方法
在继承Thread的类里面使用时只需要用this引用
上面两个副线程和主线程随机切换,又因为使用的是继承Thread的类所以两个副线程不能共享资源
start()方法调用后并不是立即执行多线程代码,而是使得该线程编程可运行状态,什么时候运行是由操作系统决定的
实现Runnable接口创建线程类
public Thread() public Thread(Runnable target) public Thread(Runnable target,String name)
public class SecondThread implements Runnable {
public void run(){
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public static void main(String[] args) {
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20){
SecondThread st=new SecondThread();
//通过new Thread(target,name)创建线程
new Thread(st,"新线程1").start();
new Thread(st,"新线程2").start();
}
}
}
}
上面的结果是两个副线程和主线程随机切换,但是并没有共享资源,因为他们根本没有能用来共享的资源。
start()方法调用后并不是立即执行多线程代码,而是使得该线程编程可运行状态,什么时候运行是由操作系统决定的
继承Thread类和创建Runnable接口的共享资源详解
在只有可以用来共享的资源时候,也就是同用一个实例化对象。两个创建方式在共享资源时才会有所区别,否则它们都不会共享资源共享资源通常用private static 修饰符来修饰。
class Thread1 extends Thread{
private int count=5;
private String name;
public Thread1(String name) {
this.name=name;
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + "运行 count= " + count--);
try {
sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
Thread1 mTh1=new Thread1("A");
Thread1 mTh2=new Thread1("B");
mTh1.start();
mTh2.start();
}
}
B运行 count= 5 A运行 count= 5 B运行 count= 4 B运行 count= 3 B运行 count= 2 B运行 count= 1 A运行 count= 4 A运行 count= 3 A运行 count= 2 A运行 count= 1
正是因为有了private int count=5;一句才有了共享资源,但这是继承Thread类的子类,并不能共享资源
class Thread2 implements Runnable{
private int count=15;
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "运行 count= " + count--);
try {
Thread.sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
Thread2 my = new Thread2();
new Thread(my, "C").start();//同一个mt,但是在Thread中就不可以,如果用同一个实例化对象mt,就会出现异常
new Thread(my, "D").start();
new Thread(my, "E").start();
}
}
C运行 count= 15 D运行 count= 14 E运行 count= 13 D运行 count= 12 D运行 count= 10 D运行 count= 9 D运行 count= 8 C运行 count= 11 E运行 count= 12 C运行 count= 7 E运行 count= 6 C运行 count= 5 E运行 count= 4 C运行 count= 3 E运行 count= 2
同样的正是因为有了private int count=15这个共同的实例化对象,实现Runnable的类才可以共享资源
那么为什么继承Thread类的子类实现Runable接口的类在共享资源时有区别呢?
因为Java中只能支持单继承,单继承特点意味着只能有一个子类去继承 而Runnabl接口后可以跟好多类,便可以进行多个线程共享一个资源的操作
使用Callable和Future创建线程
Callable怎么看起来都像Runnable接口的增强版,Callable有一个call()方法相当于Runnable的run()方法,但是功能却更加强大:
call()方法可以有返回值
call()方法可以声明抛出异常
Callable接口有泛型限制,Callable接口里的泛型形参类型与call()方法的返回值类型相同。 而且Callable接口是函数式接口,因此可使用Lambda表达式创建Callable对象 Runnable接口也是函数式接口,因此也可以使用Lambda表达式创建Runnable对象
public class ThirdThread implements Callable<Integer> {
public Integer call(){
int i=0;
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
return i;
}
public static void main(String[] args){
ThirdThread tt=new ThirdThread();
FutureTask<Integer> task=new FutureTask<>(tt);
Thread t=new Thread(task,"有返回值的线程");
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20){
t.start();
}
}
try{
System.out.println("返回值是:"+task.get());
}catch(Exception e){
e.printStackTrace();
}
}
}
使用Lambda表达式的Callable和Future创建的线程
public class ThirdThread{
public static void main(String[] args){
ThirdThread tt=new ThirdThread();
//先使用Lambda表达式创建Callable<Integer>对象
//使用FutureTask封装Callable对象
FutureTask<Integer> task=new FutureTask<Integer>((Callable<Integer>)()->{
int i=0;
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+"的循环变量i的值:"+i);
}
return i;
});
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"的循环变量i的值:"+i);
if(i==20){
new Thread(task,"有返回值的线程").start();
}
}
try{
System.out.println("子线程的返回值"+task.get());
}catch(Exception e){
e.printStackTrace();
}
}
}
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# 多线程
# 多线程的实现方法
# 多线程的三种方法
# java 中多线程生产者消费者问题详细介绍
# java多线程编程学习(线程间通信)
# Java多线程的用法详细介绍
# java多线程学习笔记之自定义线程池
# Java基于Socket实现简单的多线程回显服务器功能示例
# java 多线程Thread与runnable的区别
# java多线程学习之死锁的模拟和避免(实例讲解)
# java多线程之火车售票系统模拟实例
# Java Socket实现多线程通信功能示例
# Java多线程用法的实例详解
# 子类
# 返回值
# 什么时候
# 是由
# 只需
# 要用
# 重写
# 正是因为
# 有一个
# 的是
# 这是
# 运行状态
# 操作系统
# 就会
# 一句
# 多个
# 如有
# 不可以
# 继承了
相关文章:
测试制作网站有哪些,测试性取向的权威测试或者网站?
如何用PHP快速搭建CMS系统?
如何使用Golang table-driven基准测试_多组数据测量函数效率
如何用免费手机建站系统零基础打造专业网站?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
如何通过FTP空间快速搭建安全高效网站?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
如何快速搭建虚拟主机网站?新手必看指南
如何解决ASP生成WAP建站中文乱码问题?
建站主机核心功能解析:服务器选择与网站搭建流程指南
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
已有域名如何快速搭建专属网站?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
广州美橙建站如何快速搭建多端合一网站?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
江苏网站制作公司有哪些,江苏书法考级官方网站?
西安专业网站制作公司有哪些,陕西省建行官方网站?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
建站之星后台密码如何安全设置与找回?
如何通过VPS建站无需域名直接访问?
视频网站制作教程,怎么样制作优酷网的小视频?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
如何选择高效稳定的ISP建站解决方案?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
如何高效配置IIS服务器搭建网站?
盘锦网站制作公司,盘锦大洼有多少5G网站?
非常酷的网站设计制作软件,酷培ai教育官方网站?
微信小程序 input输入框控件详解及实例(多种示例)
英语简历制作免费网站推荐,如何将简历翻译成英文?
网站制作公司排行榜,抖音怎样做个人官方网站
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
ui设计制作网站有哪些,手机UI设计网址吗?
建站之星免费版是否永久可用?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何通过万网虚拟主机快速搭建网站?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
如何设置并定期更换建站之星安全管理员密码?
如何快速重置建站主机并恢复默认配置?
建站之星备案流程有哪些注意事项?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
小型网站建站如何选择虚拟主机?
javascript中的try catch异常捕获机制用法分析
如何注册花生壳免费域名并搭建个人网站?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。