通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记
如果我們想執(zhí)行多線程操作,通常有兩種方法
一. 繼承Thread類方式
步驟:
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();//每個(gè)線程都各賣了10張,共賣了30張票 mt2.start();//但實(shí)際只有10張票,每個(gè)線程都賣自己的票 mt3.start();//沒(méi)有達(dá)到資源共享 } }
?
二. 實(shí)現(xiàn)Runnable接口
步驟:
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();//同一個(gè)mt,但是在Thread中就不可以,如果用同一 new Thread(mt).start();//個(gè)實(shí)例化對(duì)象mt,就會(huì)出現(xiàn)異常 new Thread(mt).start(); } };
三. 總結(jié)
采用繼承Thread類方式:
(1)優(yōu)點(diǎn):編寫簡(jiǎn)單,如果需要訪問(wèn)當(dāng)前線程,無(wú)需使用Thread.currentThread()方法,直接使用this,即可獲得當(dāng)前線程。
(2)缺點(diǎn):因?yàn)榫€程類已經(jīng)繼承了Thread類,所以不能再繼承其他的父類。
采用實(shí)現(xiàn)Runnable接口方式:
(1)優(yōu)點(diǎn):線程類只是實(shí)現(xiàn)了Runable接口,還可以繼承其他的類。在這種方式下,可以多個(gè)線程共享同一個(gè)目標(biāo)對(duì)象,所以非常適合多個(gè)相 同線程來(lái)處理同一份資源的情況,從而可以將CPU代碼和數(shù)據(jù)分開(kāi),形成清晰的模型,較好地體現(xiàn)了面向?qū)ο蟮乃枷搿?br /> (2)缺點(diǎn):編程稍微復(fù)雜,如果需要訪問(wèn)當(dāng)前線程,必須使用Thread.currentThread()方法。
局限:
在并發(fā)編程中,我們經(jīng)常用到非阻塞的模型,在上述的兩種多線程實(shí)現(xiàn)中,不管是繼承thread類還是實(shí)現(xiàn)runnable接口,都無(wú)法保證獲取到之前的執(zhí)行結(jié)果。通過(guò)實(shí)現(xiàn)Callback接口,并用Future可以來(lái)接收多線程的執(zhí)行結(jié)果。
總結(jié)
以上是生活随笔為你收集整理的通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 详解get与post请求方式、conte
- 下一篇: 线程池应该设置多少核心线程数——Java