国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

for someone who can not fight

2019-11-14 11:21:20
字體:
供稿:網(wǎng)友

question 1.

public class Threads2 implements Runnable { public void run() { System.out.java.lang.RuntimeException:problemEnd of methodorEnd of methodrun.java.lang.RuntimeException:problem

main函數(shù)是一個線程 t.start開啟了另一個線程。這兩個線程同時在跑,有時候main的線程快,有時候t的線程快。在t.start();后面加上Thread.sleep(1000); 這樣一定是 run.


question 2.

Which two statements are true? (Choose two.)A. It is possible for more than two threads todeadlock at once.B. The JVM implementation guarantees that multiplethreads cannot enter into a deadlocked state.C. Deadlocked threads release once their sleep()method's sleep duration has expired.D. Deadlocking can occur only when the wait(),notify(), and notifyAll() methods are used incorrectly.E. It is possible for a single-threaded application todeadlock if synchronized blocks are used incorrectly.F. If a piece of code is capable of deadlocking, youcannot eliminate the possibility of deadlocking by inserting invocations ofThread.yield()..

【Answer】 AF

【例題辨析】 A. 題意:超過兩個線程可能立即出現(xiàn)死鎖。

符合死鎖定義。

B. 題意:Java虛擬機的實現(xiàn)能確保多個線程不會進入死鎖狀態(tài)。

Java語言中解決并發(fā)(Concurrent)運行沖突并不是由Java虛擬機負責的,而是由應用程序自行處理,比如同步化(Synchronization)等機制都由程序員在應用設(shè)計中使用的,所以,Java虛擬機并不能保證不發(fā)生死鎖。

C. 題意:只要死鎖線程的sleep()方法睡眠時間期滿,死鎖線程就會獲釋。

這種觀點顯然沒有正確理解Deadlock與sleep之間的區(qū)別,死鎖是線程對資源的競爭造成的,線程睡眠期滿并不能保證線程獲得所需資源。

D. 題意:只有當wait()、notify()、notifyAll()這些方法不正確使用時死鎖才發(fā)生。

wait()、notify()、notifyAll()這些方法不正確使用時確實可以造成死鎖,但不是死鎖發(fā)生的唯一原因,根本原因還是資源競爭,因此別的因素也可以造成死鎖。

E. 題意:只有當同步塊不正確使用時單線程應用才會死鎖。

死鎖是發(fā)生在兩個或兩個以上線程之間,既然是單線程應用那就談不上死鎖了。

F. 題意:如果一個程序片斷會死鎖,那么你就不能通過插入Thread.yield()方法調(diào)用消除死鎖。

Thread.yield()方法功能是告訴線程調(diào)度者當前線程愿意讓出對處理器(CPU)的占用,線程調(diào)度者甚至可以不理睬這個方法。造成死鎖的資源不僅是處理器,顯然這種方式并不足以解決死鎖。


question 3.

(1)線程同步(Thread Synchronization)

線程間通信主要是通過共享字段(Field)或?qū)ο笠脤崿F(xiàn)的,這種通信形式雖然高效,但會帶來線程干擾(Thread Interference)和內(nèi)存不一致的弊端,線程同步機制就是防止這類弊端的機制。不過,線程同步機制又會帶來線程競爭(Thread Contention)問題,即在兩個或兩個以上線程同時訪問同一資源時導致線程阻塞。

(2)內(nèi)部鎖(Intrinsic Lock),又稱監(jiān)控鎖(Monitor Lock)

Java同步化機制是圍繞內(nèi)部鎖建立的,每個對象都擁有唯一的一把內(nèi)部鎖,當線程需要排他性地訪問某個對象時,這個線程就需要擁有那個對象的內(nèi)部鎖,一旦這個線程擁有那個對象的內(nèi)部鎖,其他線程就不能再獲得那把內(nèi)部鎖,如果其他線程仍試圖去獲取那把內(nèi)部鎖將會被阻塞。

(3)同步化方法(Synchronized Method)和同步化語句(Synchronized Statement)

Java語言為同步化機制提供了兩種基本形式,即同步化方法(Synchronized Method)和同步化語句(Synchronized Statement)。synchronized是建立同步化方法或語句的關(guān)鍵詞。

當一個線程執(zhí)行一個同步化方法時,線程就默認擁有同步化方法所在對象的內(nèi)部鎖,其他線程要調(diào)用這個對象的同步化方法(即使是不同的同步化方法)時都會被阻塞,直到第一個線程執(zhí)行完成同步化方法釋放內(nèi)部鎖后才能再執(zhí)行這個對象的同步化方法。

同步化語句則是更加靈活的同步化機制,通過synchronized關(guān)鍵詞明確指定提供內(nèi)部鎖的對象,這樣同一個對象中不同的同步化語句塊就可以擁有不同的內(nèi)部鎖,不同的同步化語句塊就可以讓不同的線程調(diào)用執(zhí)行。

(4)wait()、notify()、notifyAll()方法

1,wait(): 讓線程處于凍結(jié)狀態(tài),被wait的線程會被存儲到線程池中。 2,notify():喚醒線程池中一個線程(任意). 3,notifyAll():喚醒線程池中的所有線程。

調(diào)用這幾個方法的對象的內(nèi)部鎖必須被當前線程獲得,如果當前線程不是主調(diào)對象內(nèi)部鎖的擁有者,則會拋出IllegalMonitorStateException。

讓調(diào)用這幾個方法的線程擁有主調(diào)對象內(nèi)部鎖的方式,主要有: (a)執(zhí)行主調(diào)對象中同步化實例方法; (b)執(zhí)行主調(diào)對象同步化語句塊; (c)對于Class對象,執(zhí)行它的同步化靜態(tài)方法。

【例題】

void waitForSignal(){ Object obj = new Object(); synchronized (Thread.currentThread()) { obj.wait(); obj.notify(); } }Which statement is true?A. This code can throw anInterruptedException.B. This code can throw anIllegalMonitorStateException.C. This code can throw aTimeoutException after ten minutes.D. Reversing the order ofobj.wait() and obj.notify() might cause this method to complete normally.E. A call to notify() ornotifyAll() from another thread might cause this method to complete normally.F. This code does NOT compileunless "obj.wait()" is replaced with "((Thread)obj).wait()".

【Answer】 B

【例題辨析】

(1)wait()和notify()這兩個方法都會拋出IllegalMonitorStateException,這個異常是RuntimeException的子類,屬于unchecked exception,可以不捕捉。但是,wait()方法還會拋出InterruptedException,這個異常必須捕捉,因此程序有編譯錯誤。應該為waitForSignal方法聲明中添加throws InterruptedException: void waitForSignal() throws InterruptedException { ……

或者,為wait()和notify()方法調(diào)用語句添加try…catch…

(2)本例中,wait()和notify()方法的主調(diào)對象是obj,而obj對象的內(nèi)部鎖沒有被當前線程取得,不符合wait()、notify()方法的調(diào)用條件,因此調(diào)用waitForSignal()時,會拋出如下異常:

Exception in thread "main"java.lang.IllegalMonitorStateExceptionatjava.lang.Object.wait(Native Method) atjava.lang.Object.wait(Unknown Source)atExamA_3.waitForSignal(ExamA_3.java:6)atExamA_3.main(ExamA_3.java:13)

解決方案是將synchronized (Thread.currentThread())修改為synchronized (obj),這樣當前線程就取得了obj對象的內(nèi)部鎖。

A. InterruptedException在編譯時就會發(fā)現(xiàn),因此不會在運行時拋出; B. 根據(jù)上面分析可知正確; C. 線程死鎖是無法預知時間的; D. 本程序錯誤不在于obj.wait() and obj.notify()調(diào)用順序,而是在于當前線程沒有取得obj內(nèi)部鎖; E. 同上 F. 同上


question 4.

class PingPong2 { synchronized void hit(long n) { for(int i = 1; i < 3; i++) System.out.print(n + "-" + i + " "); }}public class Tester implements Runnable { static PingPong2 pp2 = new PingPong2(); public static void main(String[] args) { new Thread(new Tester()).start(); new Thread(new Tester()).start(); }public void run() { pp2.hit(Thread.currentThread().getId()); }}Which statement is true?A. The output could be 5-1 6-1 6-2 5-2B. The output could be 6-1 6-2 5-1 5-2C. The output could be 6-1 5-2 6-2 5-1D. The output could be 6-1 6-2 5-1 7-1

【例題辨析】 (1)主類Tester實現(xiàn)了線程方法run(),run()的主要工作就是取得當前線程號,main()方法創(chuàng)建了兩個Tester類的線程對象,既然有兩個線程對象,也就意味著run()代碼在內(nèi)存映像中有兩份,即這兩個run()方法是各自獨立運行在兩個不同線程中,因此,Thread.currentThread().getId()取得的是各自的線程號;

(2)線程號取得后作為參數(shù)傳遞給PingPong2類對象pp2的hit()方法,hit()方法負責顯示輸出信息,hit()是同步化方法,也就意味著當某個線程調(diào)用它時,另外的線程必須等待它運行結(jié)束,才能取得調(diào)用hit()的資格。

A. 從輸出信息可以看出,5號線程調(diào)用同步化方法hit()時,該方法中循環(huán)還未運行結(jié)束,6號線程就又調(diào)用hit()輸出信息,這違背了同步化方法機制;

B. 從輸出信息可以看出,6號線程調(diào)用同步化方法hit()結(jié)束后,5號線程才能調(diào)用hit()輸出信息,這符合了同步化方法機制;

C. 同A

D. 出現(xiàn)6、5、7三個線程號,顯然不符合本題只有2個線程。


question 5.

【知識點】 (1)Thread類的start()方法 start()方法用于啟動線程的執(zhí)行,也就是讓run()方法開始運行。 start()方法只允許執(zhí)行一次,也就是說一個線程只允許啟動一次,即使執(zhí)行完畢也不允許重新啟動,否則會拋出IllegalThreadStateException。

public class Threads4 { public static void main (String[] args) { new Threads4().go();}public void go() { Runnable r = new Runnable() { public void run() { System.out.print("foo"); } }; Thread t = new Thread(r); t.start(); t.start(); }}What is the result?A. Compilation fails.B. An exception is thrown at runtime.C. The code executes normally and prints "foo".D. The code executes normally, but nothing is printed.Explanation/Reference:Exception in thread "main" java.lang.IllegalThreadStateExceptionat java.lang.Thread.start(Unknown Source)at Threads4.go(Threads4.java:14)at Threads4.main(Threads4.java:3)foo

【答案】B

A. 可以在Eclipse開發(fā)環(huán)境中嘗試錄入本程序 ,如果編輯窗口中沒有錯誤提示出現(xiàn),通常不存在編譯錯誤;

B. 同樣,在Eclipse開發(fā)環(huán)境中嘗試錄入本程序,可以看到如下信息:

fooException in thread “main”Java.lang.IllegalThreadStateException

atjava.lang.Thread.start(Unknown Source) atThreads4.go(Threads4.java:17) atThreads4.main(Threads4.java:5)

上述信息說明運行時拋出了異常,這是因為Thread類的start()方法只允許執(zhí)行一次,也就是說一個線程只允許啟動一次,即使執(zhí)行完畢也不允許重新啟動;


question 6.

public abstract class Shape {private int x;private int y;public abstract void draw();public void setAnchor(int x, int y) {this.x = x;this.y = y;}}Which two classes use the Shape class correctly? (Choose two.)A. public class Circle implements Shape {private int radius;}B. public abstract class Circle extends Shape {private int radius;}C. public class Circle extends Shape {private int radius;public void draw();}D. public abstract class Circle implements Shape {private int radius;public void draw();}E. public class Circle extends Shape {private int radius;public void draw() {/* code here */}}F. public abstract class Circle implements Shape {private int radius;public void draw() {/* code here */}}

Answer: BE


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广饶县| 延安市| 宝清县| 青州市| 四子王旗| 榕江县| 永顺县| 山西省| 西盟| 阳东县| 连山| 洪江市| 辰溪县| 南阳市| 商城县| 海盐县| 晋城| 大名县| 邓州市| 丰原市| 庄浪县| 九江县| 花莲县| 齐齐哈尔市| 上栗县| 宜丰县| 新兴县| 江北区| 洛扎县| 前郭尔| 土默特左旗| 龙胜| 云安县| 诸城市| 郯城县| 康保县| 扎鲁特旗| 东安县| 株洲市| 普宁市| 沂源县|