




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第13章 多線程 第13章 多線程 13.1 Java中的多線程實(shí)現(xiàn)技術(shù)中的多線程實(shí)現(xiàn)技術(shù) 13.2 多線程的管理多線程的管理 第13章 多線程 13.1 Java中的多線程實(shí)現(xiàn)技術(shù)中的多線程實(shí)現(xiàn)技術(shù)多線程機(jī)制是Java語言的又一重要特征,使用多線程技術(shù)可以使系統(tǒng)同時運(yùn)行多個執(zhí)行體,這樣就可以加快程序的響應(yīng)時間,提高計(jì)算機(jī)資源的使用效率。正確使用多線程技術(shù)可提高整個應(yīng)用系統(tǒng)的性能。第13章 多線程 13.1.1 線程的生命周期線程的生命周期每個Java程序都有一個缺省的主線程。對于Application,主線程是main()方法執(zhí)行的線索。對于Applet,主線程指揮瀏覽器加載并執(zhí)行Java小
2、程序。要想實(shí)現(xiàn)多線程,必須在主線程中創(chuàng)建新的線程對象。Java語言使用Thread類及其子類的對象來表示線程。新建的線程在它的一個完整的生命周期中通常要經(jīng)歷新生、就緒、運(yùn)行、阻塞和死亡等五種狀態(tài),這五種狀態(tài)之間的轉(zhuǎn)換關(guān)系和轉(zhuǎn)換條件如圖13.1所示。第13章 多線程 圖13.1 線程的生命周期 第13章 多線程 1新生狀態(tài)新生狀態(tài)當(dāng)用new關(guān)鍵字和某線程類的構(gòu)造方法創(chuàng)建一個線程對象后,這個線程對象處于新生狀態(tài),此時它已經(jīng)有了相應(yīng)的內(nèi)存空間,并已被初始化。處于該狀態(tài)的線程可通過調(diào)用start()方法進(jìn)入就緒狀態(tài)。2就緒狀態(tài)就緒狀態(tài)處于就緒狀態(tài)的線程已經(jīng)具備了運(yùn)行的條件,但尚未分配到CPU資源,因而
3、它將進(jìn)入線程隊(duì)列排隊(duì),等待系統(tǒng)為它分配CPU。一旦獲得了CPU資源,該線程就進(jìn)入運(yùn)行狀態(tài),并自動地調(diào)用自己的run方法。此時,它脫離創(chuàng)建它的主線程,獨(dú)立開始了自己的生命周期。第13章 多線程 3運(yùn)行狀態(tài)運(yùn)行狀態(tài)進(jìn)入運(yùn)行狀態(tài)的線程執(zhí)行自己的run方法中的代碼。若遇到下列情況之一,將終止run方法的執(zhí)行:(1) 終止操作。調(diào)用當(dāng)前線程的stop方法或destroy方法進(jìn)入死亡狀態(tài)。(2) 等待操作。調(diào)用當(dāng)前線程的join(millis)方法或wait(millis)方法進(jìn)入阻塞狀態(tài)。當(dāng)線程進(jìn)入阻塞狀態(tài)時,在millis(毫秒)內(nèi)可由其他線程調(diào)用notify或notifyAll方法將其喚醒,進(jìn)入就緒
4、狀態(tài)。在millis內(nèi)若不喚醒,則需等待到當(dāng)前線程結(jié)束。第13章 多線程 (3) 睡眠操作。調(diào)用sleep(millis)方法來實(shí)現(xiàn)。當(dāng)前線程停止執(zhí)行后,會處于阻塞狀態(tài),睡眠millis(毫秒)之后重新進(jìn)入就緒狀態(tài)。(4) 掛起操作。通過調(diào)用suspend方法來實(shí)現(xiàn)。將當(dāng)前線程掛起,進(jìn)入阻塞狀態(tài),之后當(dāng)其他線程調(diào)用當(dāng)前線程的resume方法后,才能使其進(jìn)入就緒狀態(tài)。(5) 退讓操作。通過調(diào)用yield方法來實(shí)現(xiàn)。當(dāng)前線程放棄執(zhí)行,進(jìn)入就緒狀態(tài)。(6) 當(dāng)前線程要求I/O時,則進(jìn)入阻塞狀態(tài)。(7) 若分配給當(dāng)前線程的時間片用完,則當(dāng)前線程進(jìn)入就緒狀態(tài)。若當(dāng)前線程的run方法執(zhí)行完,則線程進(jìn)入死亡
5、狀態(tài)。第13章 多線程 4阻塞狀態(tài)阻塞狀態(tài)一個正在執(zhí)行的線程在某些特殊情況下,如執(zhí)行了suspend、join或sleep方法,或等待I/O設(shè)備的使用權(quán),那么它將讓出CPU并暫時中止自己的執(zhí)行,進(jìn)入阻塞狀態(tài)。阻塞時它不能進(jìn)入就緒隊(duì)列,只有當(dāng)引起阻塞的原因被消除時,線程才可以轉(zhuǎn)入就緒狀態(tài),重新進(jìn)到線程隊(duì)列中排隊(duì)等待CPU資源,以便從原終止處開始繼續(xù)運(yùn)行。5死亡狀態(tài)死亡狀態(tài)處于死亡狀態(tài)的線程將永遠(yuǎn)不再執(zhí)行。線程死亡有兩個原因:一是正常運(yùn)行的線程完成了它的全部工作;二是線程被提前強(qiáng)制性地終止了。例如,通過執(zhí)行stop或destroy方法來終止線程。第13章 多線程 13.1.2 Thread類的方法
6、類的方法Thread類(線程類)是java.lang包中的一個專門用來創(chuàng)建線程和對線程進(jìn)行操作的類。Java在Thread類中定義了許多方法,這些方法可以幫助我們運(yùn)用和處理線程。這些方法可分為四組:(1) 構(gòu)造方法。該方法用于創(chuàng)建用戶的線程對象。表13.1列出了Thread類的構(gòu)造方法。第13章 多線程 表表13.1 java.lang.Thread類的構(gòu)造方法類的構(gòu)造方法 第13章 多線程 (2) run()方法。該方法用于定義用戶線程所要執(zhí)行的操作。(3) 改變線程狀態(tài)的方法,如start()、sleep()、stop()、suspend()、resume()、yield()和wait()
7、方法等。這是最常用的一組方法。(4) 其他方法,如setPriority()、setName()等。表13.2列出了Thread類的后三組方法。第13章 多線程 表表13.2 java.lang.Thread類的常用方法類的常用方法 第13章 多線程 第13章 多線程 在Java語言中創(chuàng)建線程對象有兩種途徑:一是以創(chuàng)建Thread類的子類為途徑,二是以實(shí)現(xiàn)Runnable接口為途徑。用實(shí)現(xiàn)Runnable接口的方式創(chuàng)建線程與用繼承Thread類的方式創(chuàng)建線程無本質(zhì)差別,但是,由于Java不支持多繼承,因此任何類如果已經(jīng)繼承了某一類時,就無法再繼承Thread類,這時只能通過實(shí)現(xiàn)接口Runnab
8、le的方式創(chuàng)建線程對象。例如,因?yàn)樾?yīng)用程序已經(jīng)繼承了Applet類,所以不能再繼承Thread類,而只能通過Runnable接口實(shí)現(xiàn)多線程。第13章 多線程 13.1.3 通過繼承通過繼承Thread類方式創(chuàng)建線程類方式創(chuàng)建線程前已述及,在Java語言中創(chuàng)建線程對象的途徑之一是創(chuàng)建Thread類的子類。創(chuàng)建Thread類的子類時,首先應(yīng)聲明子類的構(gòu)造方法,其次應(yīng)用自己定義的run()方法去覆蓋Thread類的run()方法,即將自己要執(zhí)行的程序區(qū)塊寫入run()方法中?!臼纠绦駽13_1.java】 用Thread類的子類創(chuàng)建兩個線程對象。第13章 多線程 imporlendar;clas
9、s C13_1 extends Thread int pauseTime; String name; public C13_1(int hTime, String hStr) pauseTime = hTime; name = hStr; public void run() Calendar now; / Calendar是Java系統(tǒng)提供的日期時間類的類型標(biāo)識符第13章 多線程 int year,month,date,hour,minute,second; for(int i=1;i10;i+) try now=Calendar.getInstance(); /取系統(tǒng)時間 year=now.
10、get(Calendar.YEAR); /取年值 month=now.get(Calendar.MONTH)+1; /取月值 date=now.get(Calendar.DATE); /取日期值 hour=now.get(Calendar.HOUR_OF_DAY); /取小時值 minute=now.get(Calendar.MINUTE); /取分值 second=now.get(Calendar.SECOND); /取秒值 System.out.println( +name+時間: +year+ 年 +month+ 月 + date+ 日 + hour+ 小時 +minute+ 分 +se
11、cond+ 秒); /顯示時間 Thread.sleep(pauseTime); 第13章 多線程 catch(Exception e) System.out.println(線程錯誤:+e); static public void main(String args) C13_1 myThread1 = new C13_1(2000, 線程A); /A線程執(zhí)行一次后睡眠2000毫秒 myThread1.start(); C13_1 myThread2 = new C13_1(1000, 線程B); /B線程執(zhí)行一次后睡眠1000毫秒 myThread2.start(); 第13章 多線程 執(zhí)行
12、這個程序后,可得到如下運(yùn)行結(jié)果(讀者上機(jī)運(yùn)行時與這里列出的具體時間不同): 線程A時間: 2012 年 8 月 19 日 9 小時 7 分 2 秒 線程B時間: 2012 年 8 月 19 日 9 小時 7 分 2 秒 線程B時間: 2012 年 8 月 19 日 9 小時 7 分 3 秒 線程A時間: 2012 年 8 月 19 日 9 小時 7 分 4 秒 線程B時間: 2012 年 8 月 19 日 9 小時 7 分 4 秒 線程B時間: 2012 年 8 月 19 日 9 小時 7 分 5 秒 線程A時間: 2012 年 8 月 19 日 9 小時 7 分 6 秒 線程B時間: 201
13、2 年 8 月 19 日 9 小時 7 分 6 秒 線程B時間: 2012 年 8 月 19 日 9 小時 7 分 7 秒 線程A時間: 2012 年 8 月 19 日 9 小時 7 分 8 秒第13章 多線程 線程B時間: 2012 年 8 月 19 日 9 小時 7 分 8 秒 線程B時間: 2012 年 8 月 19 日 9 小時 7 分 9 秒 線程A時間: 2012 年 8 月 19 日 9 小時 7 分 10 秒 線程B時間: 2012 年 8 月 19 日 9 小時 7 分 10 秒 線程A時間: 2012 年 8 月 19 日 9 小時 7 分 12 秒 線程A時間: 2012
14、 年 8 月 19 日 9 小時 7 分 14 秒 線程A時間: 2012 年 8 月 19 日 9 小時 7 分 16 秒 線程A時間: 2012 年 8 月 19 日 9 小時 7 分 18 秒第13章 多線程 13.1.4 通過實(shí)現(xiàn)通過實(shí)現(xiàn)Runnable接口方式創(chuàng)建線程接口方式創(chuàng)建線程創(chuàng)建線程對象的另一個途徑是實(shí)現(xiàn)Runnable接口,而Runnable接口只有一個方法run(),用戶新建線程的操作就由這個方法來決定。run()方法必須由實(shí)現(xiàn)此接口的類來實(shí)現(xiàn)。定義好run()方法之后,當(dāng)用戶程序需要建立新線程時,只要以這個實(shí)現(xiàn)了run()方法的類為參數(shù)創(chuàng)建系統(tǒng)類Thread的對象,就可
15、以把用戶實(shí)現(xiàn)的run()方法繼承過來。第13章 多線程 【示例程序C13_2.java】 通過創(chuàng)建兩個線程實(shí)現(xiàn)“Java Now!”與矩形框在屏幕上呈相反方向的不停走動。該程序由圖13.2所示的三個程序組成: 實(shí)現(xiàn)屏幕上的字符“Java Now!”走動的線程程序CString.java; 實(shí)現(xiàn)屏幕上矩形框走動的線程程序CSquare.java, 主程序C13_2.java。 第13章 多線程 圖13.2 示例程序位置圖 第13章 多線程 (1) 主程序C13_2.java:package c2;import java.awt.BorderLayout;import java.awt.Color
16、;import java.awt.Container;import java.awt.Dimension;import javax.swing.JApplet;public class C13_2 extends JApplet Override public void init() Container cp=getContentPane(); /得到窗口容器對象 CString pa=new CString(); /創(chuàng)建JPanel類的對象第13章 多線程 CSquare pa1=new CSquare(); /創(chuàng)建JPanel類的對象 pa.setPreferredSize(new Dim
17、ension(300,150); pa.setBackground(Color.cyan); /設(shè)置pa的對象背景顏色 pa1.setPreferredSize(new Dimension(300,150); pa1.setBackground(Color.cyan); /設(shè)置pa1的對象背景顏色 /cp容器的布局為BorderLayout,添加pa及pa1的對象到cp容器中 cp.add(pa,BorderLayout.NORTH); cp.add(pa1,BorderLayout.SOUTH); 第13章 多線程 (2) CString.java程序:package c2;import j
18、ava.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import javax.swing.JPanel;public class CString extends JPanel implements Runnable int x=10,y=50; String Message=“Java Now!”; /創(chuàng)建字符串對象 Font f=new Font(“TimesRoman”,Font.BOLD,24); /創(chuàng)建字體對象 Thread th1=new Thread(this);第13章 多線程 public CStri
19、ng() start(); private void start() th1.start(); Override public void run() while(true) x=x-5; if(x=0)x=300; repaint(); /repaint()方法調(diào)用paint()方法重畫字符串 try第13章 多線程 Thread.sleep(500); /使th1線程睡眠500ms catch(InterruptedException e) ; / while /run Override public void paint(Graphics g) super.paint(g); Graphi
20、cs2D g2=(Graphics2D)g; g2.setFont(f); /設(shè)置字體 g2.drawString(Message,x,y); 第13章 多線程 (3) CSquare.java程序:package c2;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.geom.Rectangle2D;import javax.swing.JPanel;public class CSquare extends JPanel implements Runnable int x1,y1,w1,h1; Threa
21、d th2=new Thread(this); public CSquare()第13章 多線程 x1=5; y1=100; w1=40; h1=40; start(); private void start() th2.start(); Override public void run() while(true) x1=x1+5; if(x1=250)x1=0; repaint(); /repaint()方法調(diào)用paint()方法重畫矩形框 try第13章 多線程 Thread.sleep(500); /使th2線程睡眠500ms catch(InterruptedException e)
22、; / while /run Override public void paint(Graphics g) super.paint(g); Graphics2D g2=(Graphics2D)g; Rectangle2D.Double rec1=new Rectangle2D.Double(x1,y1,w1,h1); g2.draw(rec1); 該程序的運(yùn)行結(jié)果如圖13.3所示。第13章 多線程 圖13.3 程序C13_2運(yùn)行中的一個瞬間 第13章 多線程 13.2 多線程的管理多線程的管理13.2.1 線程調(diào)度線程調(diào)度在單CPU的計(jì)算機(jī)上運(yùn)行多線程程序,或者當(dāng)線程數(shù)多于處理機(jī)的數(shù)目時,勢必
23、存在多個線程爭用CPU的情況,這時需要提供一種機(jī)制來合理地分配CPU,使多個線程有條不紊、互不干擾地工作,這種機(jī)制稱為調(diào)度。在Java運(yùn)行系統(tǒng)中,由線程調(diào)度器對線程按優(yōu)先級進(jìn)行調(diào)度。線程調(diào)度器中寫好了相應(yīng)的調(diào)度算法,當(dāng)有多個線程在同一時刻處于就緒狀態(tài)時,線程調(diào)度器會選擇優(yōu)先級最高的線程運(yùn)行。但是,如果發(fā)生下列情況之一,調(diào)度器就會終止此線程的運(yùn)行:第13章 多線程 (1) 本線程的線程體中調(diào)用了yield()方法,從而讓出了對CPU的占有權(quán);(2) 本線程的線程體中調(diào)用了sleep()方法,使線程進(jìn)入睡眠狀態(tài);(3) 本線程由于I/O操作而進(jìn)入阻塞狀態(tài);(4) 另一個具有更高優(yōu)先級的線程從睡眠狀
24、態(tài)被喚醒,或其I/O操作完成而返回就緒狀態(tài)。Java的線程調(diào)度算法可分為兩種:一種是優(yōu)先搶占式調(diào)度;另一種是輪轉(zhuǎn)調(diào)度。第13章 多線程 當(dāng)線程的優(yōu)先級不同時,為保證優(yōu)先級最高的線程先運(yùn)行而采用優(yōu)先搶占式調(diào)度算法,即優(yōu)先級高的線程優(yōu)先搶占CPU。例如,在程序的運(yùn)行過程中若設(shè)置線程A具有最高優(yōu)先級,則線程A將立即取代正在運(yùn)行的其他線程,直到線程A處于阻塞狀態(tài)或運(yùn)行結(jié)束。當(dāng)若干個線程具有相同的優(yōu)先級時,可采用隊(duì)列輪轉(zhuǎn)調(diào)度算法,即當(dāng)一個線程運(yùn)行結(jié)束時,該優(yōu)先隊(duì)列中排在最前面的線程運(yùn)行。如果某個線程由于睡眠或I/O阻塞成為一個等待再次運(yùn)行的線程,那么當(dāng)它恢復(fù)到可運(yùn)行狀態(tài)后,即被插入到該隊(duì)列的隊(duì)尾,必須等
25、到其他具有相同優(yōu)先級的線程都被調(diào)度過一次后,才有機(jī)會再次運(yùn)行。第13章 多線程 13.2.2 線程優(yōu)先級線程優(yōu)先級在Java系統(tǒng)中,運(yùn)行的每個線程都有優(yōu)先級。設(shè)置優(yōu)先級是為了在多線程環(huán)境中便于系統(tǒng)對線程進(jìn)行調(diào)度,優(yōu)先級高的線程將優(yōu)先得以運(yùn)行。Java線程的優(yōu)先級是一個在110之間的正整數(shù),數(shù)值越大,優(yōu)先級越高,未設(shè)定優(yōu)先級的線程其優(yōu)先級取缺省值5。Java線程的優(yōu)先級設(shè)置遵從下述原則:(1) 線程創(chuàng)建時,子線程繼承父線程的優(yōu)先級。(2) 線程創(chuàng)建后,可在程序中通過調(diào)用setPriority()方法改變線程的優(yōu)先級。第13章 多線程 (3) 線程的優(yōu)先級是110之間的正整數(shù),并用標(biāo)識符常量MIN
26、_PRIORITY表示優(yōu)先級為1,用NORM_PRIORITY表示優(yōu)先級為5,用MAX_PRIORITY表示優(yōu)先級為10。其他級別的優(yōu)先級既可以直接用110之間的正整數(shù)來設(shè)置,也可以在標(biāo)識符常量的基礎(chǔ)上加一個常數(shù)。例如,下面的語句將線程優(yōu)先級設(shè)置為8。setPriority(Thread.NORM_PRIORITY+3);第13章 多線程 【示例程序C13_3.java】 創(chuàng)建三個線程A、B、C,根據(jù)優(yōu)先級確定線程的執(zhí)行順序。class C13_3 public static void main(String args) Thread First=new MyThread(“A”); /創(chuàng)建A
27、線程 First.setPriority(Thread.MIN_PRIORITY); /A線程優(yōu)先級為1 Thread Second=new MyThread(“B”); /創(chuàng)建B線程 Second.setPriority(Thread.NORM_PRIORITY+1); /B線程優(yōu)先級為6 Thread Third=new MyThread(“C”); /創(chuàng)建C線程 Third.setPriority(Thread.MAX_PRIORITY); /C線程優(yōu)先級為10第13章 多線程 First.start(); Second.start(); Third.start(); class MyT
28、hread extends Thread String message; MyThread(String message) this.message= message; public void run( ) for (int i=0;i2;i+) System.out.println(message+ +getPriority(); 第13章 多線程 該程序的運(yùn)行結(jié)果如下:A 1 C 10 C 10 B 6 B 6 A 1從程序的運(yùn)行結(jié)果可以看出,雖然線程C在程序中最后調(diào)用start()方法進(jìn)入就緒狀態(tài),但由于它的優(yōu)先級是三個線程中最高的,因此可先執(zhí)行。第13章 多線程 13.2.3 線程同步
29、線程同步由于Java支持多線程,具有并發(fā)功能,從而大大提高了計(jì)算機(jī)的處理能力。在各線程之間不存在共享資源的情況下,幾個線程的執(zhí)行順序可以是隨機(jī)的。但是,當(dāng)兩個或兩個以上的線程需要共享同一資源時,線程之間的執(zhí)行次序就需要協(xié)調(diào),并且在某個線程占用這一資源時,其他線程只能等待。例如生產(chǎn)者和消費(fèi)者的問題,只有當(dāng)生產(chǎn)者生產(chǎn)出產(chǎn)品并將其放入貨架后,消費(fèi)者才能從貨架上取走產(chǎn)品進(jìn)行消費(fèi)。當(dāng)生產(chǎn)者沒有生產(chǎn)出產(chǎn)品時,消費(fèi)者是沒法消費(fèi)的。同理,當(dāng)生產(chǎn)者生產(chǎn)的產(chǎn)品堆滿貨架時,應(yīng)該暫停生產(chǎn),等待消費(fèi)者消費(fèi)。在程序設(shè)計(jì)中,可用兩個線程分別代表這里的第13章 多線程 生產(chǎn)者和消費(fèi)者,可將貨架視為任意時刻只允許一個線程訪問的
30、臨界資源。在這個問題中,兩個線程要共享貨架這一臨界資源,需要在某些時刻(貨空/貨滿)協(xié)調(diào)它們的工作,即貨空時消費(fèi)者應(yīng)等待,而貨滿時生產(chǎn)者應(yīng)等待。為了不發(fā)生混亂,還可進(jìn)一步規(guī)定:當(dāng)生產(chǎn)者往貨架上放貨物時不允許消費(fèi)者取貨物,當(dāng)消費(fèi)者從貨架上取貨物時不允許生產(chǎn)者放貨物。這種機(jī)制在操作系統(tǒng)中稱為線程間的同步。在同步機(jī)制中,將那些訪問臨界資源的程序段稱為臨界區(qū)。第13章 多線程 在Java系統(tǒng)中,臨界區(qū)程序段是用關(guān)鍵字“synchronized”來標(biāo)注,并通過一個稱為監(jiān)控器的系統(tǒng)軟件來管理的。當(dāng)執(zhí)行被冠以synchronized的程序段即臨界區(qū)程序時,監(jiān)控器將這段程序(訪問的臨界資源)加鎖,此時,稱該線
31、程占有臨界資源,直到這段程序執(zhí)行完,才釋放鎖。只有鎖被釋放后,其他線程才可以訪問這些臨界資源。用關(guān)鍵字synchronized定義臨界區(qū)的語句形式是:synchronized (expression) statement其中,expression代表類的名字,是可選項(xiàng);statement可以是一個方法,也可以是一個語句或一個語句塊,最常見的是一個方法。下面通過一個例子來說明線程的同步問題。第13章 多線程 【示例程序C13_4.java】 生產(chǎn)者與消費(fèi)者的同步問題。public class C13_4 public static void main(String args) HoldInt h
32、=new HoldInt(); /h為監(jiān)控器 ProduceInt p=new ProduceInt(h); ConsumeInt c=new ConsumeInt(h); p.start(); c.start(); 第13章 多線程 class HoldInt private int sharedInt; private boolean writeAble=true; /writeAble=true表示生產(chǎn)者線程能生產(chǎn)新數(shù)據(jù) public synchronized void set(int val) /臨界區(qū)程序段,也稱為同步方法 while(!writeAble) /生產(chǎn)者線程不能生產(chǎn)新數(shù)
33、據(jù)時進(jìn)入等待 try wait(); catch(InterruptedException e) /生產(chǎn)者被喚醒后繼續(xù)執(zhí)行下面的語句 writeAble=false; sharedInt=val; notify(); 第13章 多線程 public synchronized int get() /同步方法 while(writeAble) /消費(fèi)者線程不能消費(fèi)數(shù)據(jù)時進(jìn)入等待狀態(tài) try wait(); catch(InterruptedException e) /消費(fèi)者被喚醒后繼續(xù)執(zhí)行下面的語句 writeAble=true; notify(); return sharedInt; 第13章 多線程 /ProduceInt 是生產(chǎn)者線程class ProduceInt extends Thread private HoldInt hi; public ProduceInt(HoldInt hiForm) hi=hiForm; public void run( ) for(int i=1;i=4;i+) hi.set(i); System.out.println(產(chǎn)生的新數(shù)據(jù)是: + i); 第13章 多線程 /ConsumeInt 是消費(fèi)者線程class ConsumeInt extends Thread private HoldInt hi; public ConsumeIn
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 書店周年慶活動方案
- 主持社團(tuán)選拔活動方案
- 舉辦民間集會活動方案
- 主食福利活動方案
- 書影時光活動方案
- 中考餐飲活動方案
- 融資租賃公司員工培訓(xùn)與績效管理體系優(yōu)化
- 腳手架工程施工方案
- 投資銀行資本市場運(yùn)作效率提升方案
- 主題公園的背景意義及必要性
- 起重機(jī)械吊具、索具檢查記錄表(鋼絲繩)
- 中學(xué)籃球社團(tuán)教案全套
- 湖北省部分高中2025屆高三上學(xué)期11月(期中)聯(lián)考語文試題(含答案)
- 2024秋期國家開放大學(xué)本科《經(jīng)濟(jì)學(xué)(本)》一平臺在線形考(形考任務(wù)1至6)試題及答案
- 2024版《大學(xué)生職業(yè)生涯規(guī)劃與就業(yè)指導(dǎo)》 課程教案
- 北師大版五年級下冊解方程練習(xí)100道及答案
- 五年級上冊數(shù)學(xué)培優(yōu)奧數(shù)講義-第15講 余數(shù)定理
- 職業(yè)素質(zhì)養(yǎng)成(吉林交通職業(yè)技術(shù)學(xué)院)智慧樹知到答案2024年吉林交通職業(yè)技術(shù)學(xué)院
- 初中化學(xué)課程標(biāo)準(zhǔn)(2022年版)考試題庫(含答案)
- 工程造價咨詢服務(wù)入圍供應(yīng)商招標(biāo)文件模板
- 網(wǎng)絡(luò)餐飲食品安全培訓(xùn)
評論
0/150
提交評論