通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记相关的知识,希望对你有一定的参考价值。

如果我们想执行多线程操作,通常有两种方法

一. 继承Thread类方式


步骤:

  1. 自定义类继承Thread
  2. 覆盖Thread中的run()方法
  3. 创建该类的对象,调用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接口


步骤:

  1. 定义一个实现Runnable接口的类
  2. 覆盖run方法
  3. 创建该类对象,并以该类对象为参数创建Thread类的对象,从而创建了一个线程
  4. 调用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并发系列学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Java基础加强之并发常用的多线程实现方式

并发编程之线程创建到销毁常用API

如何实现springMVC的多线程并发?

如何实现springMVC的多线程并发?

诺禾:诺禾通俗易懂的告诉你java多线程中wait和sleep的区别

Java并发编程之美