通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记
Posted 来老铁干了这碗代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记相关的知识,希望对你有一定的参考价值。
如果我们想执行多线程操作,通常有两种方法
一. 继承Thread类方式
步骤:
- 自定义类继承Thread
- 覆盖Thread中的run()方法
- 创建该类的对象,调用start()方法,开启线程并调用run方法
class MyThread extends Thread
private int ticket=10;
public void run()
for(int i=0;i<20;i++)
if(this.ticket>0)
System.out.println("卖票:ticket"+this.ticket--);
;
public class ThreadTicket
public static void main(String[] args)
MyThread mt1=new MyThread();
MyThread mt2=new MyThread();
MyThread mt3=new MyThread();
mt1.start();//每个线程都各卖了10张,共卖了30张票
mt2.start();//但实际只有10张票,每个线程都卖自己的票
mt3.start();//没有达到资源共享
二. 实现Runnable接口
步骤:
- 定义一个实现Runnable接口的类
- 覆盖run方法
- 创建该类对象,并以该类对象为参数创建Thread类的对象,从而创建了一个线程
- 调用start方法,开启线程并调用run方法。
package org.demo.runnable;
class MyThread implements Runnable
private int ticket=10;
public void run()
for(int i=0;i<20;i++)
if(this.ticket>0)
System.out.println("卖票:ticket"+this.ticket--);
package org.demo.runnable;
public class RunnableTicket
public static void main(String[] args)
MyThread mt=new MyThread();
new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一
new Thread(mt).start();//个实例化对象mt,就会出现异常
new Thread(mt).start();
;
三. 总结
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相 同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
局限:
在并发编程中,我们经常用到非阻塞的模型,在上述的两种多线程实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。
以上是关于通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记的主要内容,如果未能解决你的问题,请参考以下文章