
为什么要实现多线程:①可以提高资源利用率,如一个程序需要跑一段很长的时间,要是单线程只能等这个跑完。但多线程可以并发(单个Cpu)、并列(多个CPU)去执行其他的一些程序。
②让程序中的某个功能可以一个线程去做一件具体事情。(高效)
二、实现多线程有三种方法
①继承Thread类的方式。 ②实现Runnable接口的方式。③使用线程池的方式。
①继承Thread(线程)类说明
自定义的类中用extends关键字继承。之后得重写Run()方法。在方法里面写上自己要实现的内容。最后通过调用start()方法,启动线程
注:这里的所有方法都是继承自父类(Thread)的,要写上继承才能使用这些方法。
②Runnable(接口)的使用说明
在类中用implements关键字书写接口,加上Runnable并重写run()方法,Runnable只有一个方法就是run()方法,修改完后,在测试类中调用并创建对象作为任务,将创建对象的变量名填写在Thread的构造方法中。调用Thread的start()方法启动线程。
对比这两种各有优缺点:
第一种:中直接继承的第一个缺点就是将继承机会使用了,父类只能是Thread,但有点就是编写简单,并且继承后可以直接使用父类的各种方法。
第二种:中是通过接口方式去使用,因为接口可以有多个,因此扩展性强。但编写较为复杂,并且不能直接使用Thread的方法。只能间接去使用。
Thread的常用方法
注意:并不是说设置了优先级就优先执行这个线程,只能说CPU会优先执行但这也不是绝对的,因为线程执行还是有随机性,只是概率上来说优先级越高的线程越有机会先执行。
线程安全问题
说明:为什么会有线程安全问题,是因为当多个线程访问共享数据,且多个线程对共享数据有更新 *** 作时,就容易出现线程安全问题。
java提供了三种解决出现问题的办法
1.同步代码块
格式: synchronized(同步锁) { 有线程安全问题的代码 }
实例方法(无static修饰):同步锁对象就是this。(当前方法调用者对象)
静态方法(static修饰):同步锁对象为当前类的Class对象。 (类名.class 或者 对象名.getClass() 可以获取类的字节码对象 )
注:同步锁可以使用使用任意对象,Java中处处皆对象。但推荐使用官方推荐的方式来(即上面两种)
2.同步方法
格式: 修饰符 synchronized 返回值类型 方法名(参数列表) { 方法体; }
3.Lock锁机制
try{ lock.lock(); //加锁 需要同步处理的代码; }finally{ lock.unlock(); //在finally块中,保证锁一定会被释放。 }
(具体看我上传的三种处理方式)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)