多线程的几种创建方式

您所在的位置:网站首页 linux多线程的实现方式有几种 多线程的几种创建方式

多线程的几种创建方式

2024-07-11 22:33| 来源: 网络整理| 查看: 265

先说下线程的几种状态(5种):

新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就     绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:

1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;

2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;

3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 

ps:另线程阻塞wait与sleep的区别:字面意思理解为,wait为等待,直到被唤醒;而sleep为睡眠,直到设定的时间,所以wait需要手动唤醒,而sleep不需要。

ps:stop与interrupt为中断线程:

interrupt:首先说interrupt, 它没有stop那么的粗暴,因为可以用catch捕捉到InterruptedException这个异常。

stop(这个已经被废弃,线程阻塞):获取的资源,获取的锁都不释放,相当于无限期的等待下去了,因此不推荐的。因为此时线程直接终止,没有catch异常的机会, 无法对线程结束这一行为作出任何补救动作。

无论是interrupt还是stop都是不安全的做法,因为如果我们在线程进行时打开了某些资源,那么这样粗暴的结束资源将无法正确关闭

 

多线程的几种创建方式:

1.继承Thread类:

package com.xingsfdz.javabase.thread; /** * * @类名称 ThreadDemo.java * @类描述 多线程创建方式之继承Thread * @作者 xingsfdz [email protected] * @创建时间 2020年4月7日 下午10:27:12 * @版本 1.00 * * @修改记录 * * 版本 修改人 修改日期 修改内容描述 * ---------------------------------------------- * 1.00 xingsfdz 2020年4月7日 * ---------------------------------------------- * */ public class ThreadDemo { public static void main(String[] args) { //设置线程名字,不设置则使用默认构造 0 1 2 3...这样 Thread.currentThread().setName("主线程"); MyThread myThread = new MyThread(); myThread.setName("子线程:"); //开启线程 myThread.start(); for(int i = 0;iSystem.out.println("Lambda方式启动线程"); runnable.run(); } }

结果: 

传统写法的实现Runnable接口的线程 Lambda方式启动线程

 

8.Spring实现多线程:

使用java代码配置:Config.java

package com.xingsfdz.demo.util.Thread.spring; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; /** * * @类名称 Config.java * @类描述 一下操作相当于我们前期的spring配置文件的操作 * @作者 xingsfdz [email protected] * @创建时间 2020年4月8日 下午2:18:47 * @版本 1.00 * * @修改记录 * * 版本 修改人 修改日期 修改内容描述 * ---------------------------------------------- * 1.00 xingsfdz 2020年4月8日 * ---------------------------------------------- * */ //标识为配置文件 @Configuration //扫描的包 @ComponentScan("com.xingsfdz.demo.util.Thread.spring") //支持异步,不使用该注解,则不会执行后面的方法 @EnableAsync public class Config { }

编写一个服务类:ServiceDemo  

package com.xingsfdz.demo.util.Thread.spring; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; //注入容器管理 @Service public class ServiceDemo { //注解为支持异步 @Async public void a(){ while(true){ System.out.println("处理a方法"); try { Thread.sleep(3000);//单位 毫秒 } catch (InterruptedException e) { e.printStackTrace(); } } } @Async public void b(){ while(true){ System.out.println("处理b方法"); try { Thread.sleep(3000);//单位 毫秒 } catch (InterruptedException e) { e.printStackTrace(); } } } }

运行测试:

package com.xingsfdz.demo.util.Thread.spring; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * * @类名称 SpringDemo.java * @类描述 spring方式多线程 * @作者 xingsfdz [email protected] * @创建时间 2020年4月8日 下午2:15:25 * @版本 1.00 * * @修改记录 * * 版本 修改人 修改日期 修改内容描述 * ---------------------------------------------- * 1.00 xingsfdz 2020年4月8日 * ---------------------------------------------- * */ public class SpringDemo { public static void main(String args[]){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);//加载配置文件 ServiceDemo sd = ac.getBean(ServiceDemo.class);//获得类实例对象 sd.a(); sd.b(); } }

 运行结果:循环执行表示异步执行成功

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3