A. java線程問題
不管你是新程序員還是老手,你一定在面試中遇到過有關線程的問題。Java語言一個重要的特點就是內置了對並發的支持,讓Java大受企業和程序員的歡迎。大多數待遇豐厚的Java開發職位都要求開發者精通多線程技術並且有豐富的Java程序開發、調試、優化經驗,所以線程相關的問題在面試中經常會被提到。
在典型的Java面試中, 面試官會從線程的基本概念問起, 如:為什麼你需要使用線程, 如何創建線程,用什麼方式創建線程比較好(比如:繼承thread類還是調用Runnable介面),然後逐漸問到並發問題像在Java並發編程的過程中遇到了什麼挑戰,Java內存模型,JDK1.5引入了哪些更高階的並發工具,並發編程常用的設計模式,經典多線程問題如生產者消費者,哲學家就餐,讀寫器或者簡單的有界緩沖區問題。僅僅知道線程的基本概念是遠遠不夠的, 你必須知道如何處理死鎖,競態條件,內存沖突和線程安全等並發問題。掌握了這些技巧,你就可以輕松應對多線程和並發面試了。
許多Java程序員在面試前才會去看面試題,這很正常。因為收集面試題和練習很花時間,所以我從許多面試者那裡收集了Java多線程和並發相關的50個熱門問題。我只收集了比較新的面試題且沒有提供全部答案。想必聰明的你對這些問題早就心中有數了, 如果遇到不懂的問題,你可以用Google找到答案。若你實在找不到答案,可以在文章的評論中向我求助。
B. E語言怎麼暫停指定進程的線程!
如果你有多線程支持庫
暫停線程()
終止線程()
退出線程()
都可以
註:安裝支持庫:
運行易語言主程序後1.>點菜單欄-T.工具-L.支持庫配置
2.>點擊全選按鈕-確認即可
C. 多線程是什麼
多線程(multithreading),是指從軟體或者硬體上實現多個線程並發執行的技術。具有多線程能力的計算機因有硬體支持而能夠在同一時間執行多於一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶元級多處理或同時多線程處理器。在一個程序中,這些獨立運行的程序片段叫作「線程」(Thread),利用它編程的概念就叫作「多線程處理」。
在計算機編程中,一個基本的概念就是同時對多個任務加以控制。許多程序設計問題都要求程序能夠停下手頭的工作,改為處理其他一些問題,再返回主進程。可以通過多種途徑達到這個目的。最開始的時候,那些掌握機器低級語言的程序員編寫一些「中斷服務常式」,主進程的暫停是通過硬體級的中斷實現的。盡管這是一種有用的方法,但編出的程序很難移植,由此造成了另一類的代價高昂問題。中斷對那些實時性很強的任務來說是很有必要的。但對於其他許多問題,只要求將問題劃分進入獨立運行的程序片斷中,使整個程序能更迅速地響應用戶的請求 。
最開始,線程只是用於分配單個處理器的處理時間的一種工具。但假如操作系統本身支持多個處理器,那麼每個線程都可分配給一個不同的處理器,真正進入「並行運算」狀態。從程序設計語言的角度看,多線程操作最有價值的特性之一就是程序員不必關心到底使用了多少個處理器。程序在邏輯意義上被分割為數個線程;假如機器本身安裝了多個處理器,那麼程序會運行得更快,毋需作出任何特殊的調校。根據前面的論述,大家可能感覺線程處理非常簡單。但必須注意一個問題:共享資源!如果有多個線程同時運行,而且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來說,兩個線程不能將信息同時發送給一台列印機。為解決這個問題,對那些可共享的資源來說(比如列印機),它們在使用期間必須進入鎖定狀態。所以一個線程可將資源鎖定,在完成了它的任務後,再解開(釋放)這個鎖,使其他線程可以接著使用同樣的資源。
D. Jmeter如何控制線程執行
首先明確如何管理線程執行 -- 使用線程組實現 -- 管理線程的的單位(針對線程按照性質分組管理的結果) -- 方便管理線程 , 控制線程執行
其次,明確執行的順序 -- 線程執行順序
1. 並發執行 -- 多線程同時執行 -- 線程啟動和結束順序不一致
2. 順序執行 -- 多線程先後執行 -- 線程啟動和結束順序一致
最後,怎麼讓線程執行停下來,這個也是可以控制的
1. 可以通過線程的循環次數 -- 通過循環次數停下腳本執行
2. 也可以通過調度器實現腳本執行的時間控制,設置持續時間,超出停止
這些操作當時在黑馬程序員學習的時候,為了設計不同的測試場景,都認真學習和練習了
E. android thread join和stop的區別
stop() 方法是立即停止當前線程, 這樣停止的後果是導致stop後的語句無法執行, 有可能資源未釋放或者在同步塊中調用此方法會導致同步數據會不完整. 所以這樣的方法並不安全. 強列建議不要使用此函數來中斷線程。
interrupt()方法沒有stop那麼的粗暴,因為可以用catch捕捉到InterruptedException這個異常。一個線程處於了阻塞狀態(如線程調用了thread.sleep、thread.join、thread.wait以及可中斷的通道上的
I/O
操作方法後可進入阻塞狀態),方法調用處拋出InterruptedException異常,拋出異常是為了線程從阻塞狀態醒過來,並在結束線程前讓程序員有足夠的時間來處理中斷請求。
join() 方法作用是:「等待該線程終止」,這里需要理解的就是該線程是指的主線程等待子線程的終止。也就是在主線程調用了join()方法後面的代碼,只有等到子線程結束了才能執行
F. C#如何結束子窗體中的一個使用begininvoke創建的非同步線程並關閉子窗口
用EndInvoke方法終止它。 參數就是BeginInvoke方法的返回值
G. java中多線程,時間片是什麼意思如果分給線程的時間片不夠運行完一個線程怎麼辦這個線程接下來怎麼辦
這個時間片是操作系統自己分配的,程序員只需要決定是否啟動線程和終止線程就可以了。時間片是並行操作系統中的一個概念,意思是將時間分成多個小片段根據線程優先順序採用某些策略以此給不同的線程分配時間片段,從用戶的角度來看線程好像是在同時運行一樣。現在採用多核系統可以真正的同時運行多個線程了,這裡面的分配機制就更加復雜了。寫java代碼操作不到這么底層的東西。
H. c#如何殺掉線程
該示例創建一個名為 Worker 的類,該類包含輔助線程將執行的方法 DoWork。這實際上是輔助線程的 Main 函數。輔助線程將通過調用此方法來開始執行,並在此方法返回時自動終止。DoWork 方法如下所示:
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("worker thread: working...");
}
Console.WriteLine("worker thread: terminating gracefully.");
}
Worker 類包含另一個方法,該方法用於通知 DoWork 它應當返回。此方法名為 RequestStop,如下所示:
public void RequestStop()
{
_shouldStop = true;
}
RequestStop 方法只是將 true 賦給 _shouldStop 數據成員。由於此數據成員由 DoWork 方法來檢查,因此這會間接導致 DoWork 返回,從而終止輔助線程。但是,需要注意:DoWork 和 RequestStop 將由不同線程執行。DoWork 由輔助線程執行,而 RequestStop 由主線程執行,因此 _shouldStop 數據成員聲明為 volatile,如下所示:
private volatile bool _shouldStop;
volatile 關鍵字用於通知編譯器,將有多個線程訪問 _shouldStop 數據成員,因此它不應當對此成員的狀態做任何優化假設
通過將 volatile 與 _shouldStop 數據成員一起使用,可以從多個線程安全地訪問此成員,而不需要使用正式的線程同步技術,但這僅僅是因為 _shouldStop 是 bool。這意味著只需要執行單個原子操作就能修改 _shouldStop。但是,如果此數據成員是類、結構或數組,那麼,從多個線程訪問它可能會導致間歇的數據損壞。假設有一個更改數組中的值的線程。Windows 定期中斷線程,以便允許其他線程執行,因此線程會在分配某些數組元素之後和分配其他元素之前被中斷。這意味著,數組現在有了一個程序員從不想要的狀態,因此,讀取此數組的另一個線程可能會失敗。
在實際創建輔助線程之前,Main 函數會創建一個 Worker 對象和 Thread 的一個實例。線程對象被配置為:通過將對 Worker.DoWork 方法的引用傳遞給 Thread 構造函數,來將該方法用作入口點,如下所示:
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
此時,盡管輔助線程對象已存在並已配置,但尚未創建實際的輔助線程。只有當 Main 調用 Start 方法後,才會創建實際的輔助線程:
workerThread.Start();
此時,系統將啟動輔助線程的執行,但這是在與主線程非同步執行的。這意味著 Main 函數將在輔助線程進行初始化的同時繼續執行代碼。為了保證 Main 函數不會嘗試在輔助線程有機會執行之前將它終止,Main 函數將一直循環,直到輔助線程對象的 IsAlive 屬性設置為 true:
while (!workerThread.IsAlive);
下一步,通過調用 Sleep 來將主線程中斷片刻。這保證了輔助線程的 DoWork 函數在 Main 函數執行其他任何命令之前,在 DoWork 方法內部執行若干次循環:
Thread.Sleep(1);
在 1 毫秒之後,Main 將通知輔助線程對象,它應當使用 Worker.RequestStop 方法(前面已介紹)自行終止:
workerObject.RequestStop();
還可以通過調用 Abort 來從一個線程終止另一個線程,但這會強行終止受影響的線程,而不管它是否已完成自己的任務,並且不提供清理資源的機會。此示例中顯示的技術是首選方法。
最後,Main 函數對輔助線程對象調用 Join 方法。此方法導致當前線程阻塞或等待,直到對象所表示的線程終止。因此,直到輔助線程返回後,Join 才會返回,然後自行終止:
workerThread.Join();
此時,只有執行 Main 的主線程還存在。它會顯示一條最終消息,然後返回,從而使主線程也終止。
下面顯示了完整的示例:
using System;
using System.Threading;
public class Worker
{
// This method will be called when the thread is started.
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("worker thread: working...");
}
Console.WriteLine("worker thread: terminating gracefully.");
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile is used as hint to the compiler that this data
// member will be accessed by multiple threads.
private volatile bool _shouldStop;
}
public class WorkerThreadExample
{
static void Main()
{
// Create the thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
// Start the worker thread.
workerThread.Start();
Console.WriteLine("main thread: Starting worker thread...");
// Loop until worker thread activates.
while (!workerThread.IsAlive);
// Put the main thread to sleep for 1 millisecond to
// allow the worker thread to do some work:
Thread.Sleep(1);
// Request that the worker thread stop itself:
workerObject.RequestStop();
// Use the Join method to block the current thread
// until the object's thread terminates.
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
}
}
I. 在java中啟動線程使用run()還是start()
啟動一個線程用start()方法,使線程所代表的虛擬處理機處於可運行的狀態,這意味著它可以有JVM(java虛擬機)來調度和執行,這並不意味著線程就會立即執行。run()方法可以產生必須退出的標志來停止一個線程。