今天我在一次採訪中被問到Java中的Thread概念嗎?問題是...Java中的線程
- 什麼是線程?
- 我們爲什麼要穿線?
- 線程的實時示例。
- 我們可以在Spring框架服務類中創建線程。
- 可以彈性調用線程?
除了Thread的定義之外,我沒有回答任何問題,我也是從互聯網上學到的。
任何人都可以解釋清楚這一點。
更新:
是什麼的線程和普通的Java類之間的差異。我們爲什麼需要線程...我可以在線程中執行業務邏輯嗎? 我可以在線程中調用不同的類方法。
今天我在一次採訪中被問到Java中的Thread概念嗎?問題是...Java中的線程
除了Thread的定義之外,我沒有回答任何問題,我也是從互聯網上學到的。
任何人都可以解釋清楚這一點。
更新:
是什麼的線程和普通的Java類之間的差異。我們爲什麼需要線程...我可以在線程中執行業務邏輯嗎? 我可以在線程中調用不同的類方法。
要創建線程,創建一個擴展Thread類的新類並實例化該類。擴展類必須重寫run()方法並調用start()方法才能開始執行線程。
在run()中,您將定義構成新線程的代碼。理解run()可以調用其他方法,使用其他類並像主線程一樣聲明變量很重要。唯一的區別是run()爲程序中的另一個併發執行線程建立入口點。這將在run()返回時結束。
public class MyThread extends Thread {
String word;
public MyThread(String rm){
word = rm;
}
public void run(){
try {
for(;;){
System.out.println(word);
Thread.sleep(1000);
}
} catch(InterruptedException e) {
System.out.println("sleep interrupted");
}
}
public static void main(String[] args) {
Thread t1=new MyThread("First Thread");
Thread t2=new MyThread("Second Thread");
t1.start();
t2.start();
}
}
輸出屏幕:
First Thread
Second Thread
First Thread
Second Thread
First Thread
,看看這個:
http://www.javaworld.com/javaworld/jw-04-1996/jw-04-threads.html
和Spring,你可以使用線程池:
http://static.springsource.org/spring/docs/2.0.x/reference/scheduling.html
我可以回答第一個3,因爲我不太熟悉Spring或Flex的線程特性。
線程是具有其自己的寄存器,堆棧和代碼段可在運行過程與其它線程並行(該過程是線程的集合)中的對象。
您編寫的程序的多線程代碼爲響應用戶交互。想想看,如果你不得不等待瀏覽器完成下載文件,然後才能繼續瀏覽,那將是多麼令人討厭。
我在#2中舉了一個例子。其他示例包括任何帶有GUI的程序(GUI必須始終在執行後臺任務時響應用戶輸入)或服務器類型的軟件(例如Web服務器),您可能必須每分鐘響應1000個請求。爲每個響應設置一個單獨的線程會更好。
它自己的代碼段?你從哪裏得到這些荒謬的說法?你知道段是什麼嗎?段和段選擇器之間的區別?平坦和分段內存模型之間的區別? – 2016-09-04 16:35:29
就Spring而言,是的,你絕對可以創建自己的線程。但使用Spring Framework手冊的Chapter 25中描述的線程池支持是一個更好的主意。
然而,有請求產卵在基於Spring的Web服務(或與此有關的任何Web服務)的線程引入資源管理方面的問題,您可能希望避免...
的一個關鍵概念搞清楚是一個線程是一個操作系統調度對象,它恰好有一個代表它的Java類(就像在UI子系統中的Window那樣)。線程本身不是一種類。
Flex無法直接與Java線程通信,無論使用JMS還是其他類型的消息都必須通過某種消息傳遞,Flex通過BlazeDS,GraniteDS或LCDS可以與JMS通信。還有一點需要記住的是,目前無論如何,Flash/Flex本身是單線程的,但是高度異步......有人會說TOO是異步的......所以任何使用Java線程來加速事物可能都沒有這是你所希望的效果。
多線程是一項Java功能,它允許同時執行程序的兩個或更多部分以最大程度地利用CPU。這種程序的每個部分都稱爲線程。所以,
線程是一個進程內的輕量級進程。
線程可以通過使用兩個機制來創建的:
線程創建通過擴展Thread類
我們創建一個擴展類java.lang.Thread
類。該類覆蓋Thread
類中可用的run()
方法。一個線程在run()
方法中開始其生命。我們創建一個新類的對象並調用start()
方法來啓動線程的執行。 Start()
在Thread
對象上調用run()
方法。
class MultithreadingDemo extends Thread{
public void run() {
try { // Displaying the thread that is running
System.out.println ("Thread " + Thread.currentThread().getId()
+ " is running");
}
catch (Exception e){ // Throwing an exception
System.out.println ("Exception is caught");
}
}
}
public class Multithread{
public static void main(String[] args) {
int n = 8; // Number of threads
for (int i=0; i<8; i++) {
MultithreadingDemo object = new MultithreadingDemo();
object.start();
}
}
}
線程創建通過實現Runnable接口
我們創建一個實現java.lang.Runnable
接口和覆蓋run()
方法的新類。然後我們實例化一個Thread對象並在這個對象上調用start()
方法。
class MultithreadingDemo implements Runnable{
public void run() {
try { // Displaying the thread that is running
System.out.println ("Thread " + Thread.currentThread().getId() +
" is running");
}
catch (Exception e) { // Throwing an exception
System.out.println ("Exception is caught");
}
}
}
class Multithread{
public static void main(String[] args) {
int n = 8; // Number of threads
for (int i=0; i<8; i++) {
Thread object = new Thread(new MultithreadingDemo());
object.start();
}
}
}
Thread類VS Runnable接口
如果我們擴展了Thread類,我們的類不能擴展任何其他類,因爲Java不支持多重繼承。但是,如果我們實現Runnable接口,我們的類仍然可以擴展其他基類。
我們可以通過擴展Thread類來實現線程的基本功能,因爲它提供了Runnable接口中不可用的某些內置方法,如yield(),interrupt()等。
看一看甲骨文tutorial
線程有時稱爲輕量級進程。線程存在於一個進程中 - 每個進程至少有一個線程。線程共享進程的資源,包括內存和打開的文件。這使得溝通有效但可能有問題。
爲什麼我們要穿線?
多線程執行是Java平臺的基本功能。線程是彼此獨立的。
您可以通過分解多個子計算來並行化您的計算。
您可以有效地使用服務器的CPU核心。
例如,
ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors());
如果您在線程之間遵循無共享的方法(這是不可能的),多線程應用程序提供了高吞吐量。
線程上的實時示例。
想想WhatsApp類型的聊天應用程序。
服務器應該在數以千計的用戶之間發送和接收聊天消息。單線程應用程序是處理這種用例的災難。
是什麼的線程和普通的Java類之間的差異。爲什麼我們需要線程......我可以在線程中執行業務邏輯嗎?我可以在線程中調用不同的類方法嗎?
Thread類可以實現Runnable或擴展Thread。看看甲骨文教程page
可以在線程中執行業務邏輯。
您可以調用線程不同類的方法。
好回答什麼是線程在Java中簡單的一句話其程序/件的與您的正常類同時工作的代碼。普通類和線程的不同之處在於線程與普通類一起同時工作。 用更簡單的術語讓我們看看一個例子,其中我當前在主函數中,並且需要一個函數來計算某些東西。所以如果該函數不在一個線程中,那麼該函數將被首先評估,然後在另一方面,如果它是一個線程,我將返回到主函數,然後該函數將計算並且main將計算其下一條指令。
現在,作爲給一個線程的創建 1.延伸線程類:延伸線程類和寫start()
其一個函數使用當前類的對象調用它,並且即寫一個函數void run()
和在此函數寫代碼,其需要同時執行。
擴展線程的類的每個對象都是一個自定義的線程。默認情況下,每個線程都處於非活動狀態,並激活或調用該線程只寫start()
這會自動調用包含您的代碼的運行。
class MyThreads extends Thread
{
int ch ;
MyThreads(int p)
{
ch = p;
start();//statement to activate thread and call run
}
public void run()
{
if(ch == 1)
functionx()
else if(ch == 2)
functiony();
}
void fx1()
{
//parallel running code here
}
void fx2()
{
//parallel running code here
}
public static void main(String args[])
{
MyThreads obj1 = new MyThreads(1);
My3Threads obj2 = new MyThreads(2);
//mains next instruction code here
}
}
Runnable
但因爲這是一個界面,該界面與當前類因此調用開始將調用這是寫在接口功能run()
兼容但撥打我們的run()
函數調用start像這樣Thread t=new thread(this); t.start();
一個線程對象我們爲什麼我們去線程,這就好比問爲什麼我們去爲多核處理器你得到我的意思,多線程用於同時執行任務
一個實時的例子是一個服務器的任何服務器,考慮Gmail.So的服務器如果g郵件服務器不使用多線程的話,我不能沒有你退出,這意味着在全世界登錄只寫了一個人可以一次登錄,看看它是多麼不切實際。
迂腐尖端獲得Java的問題,要採取更嚴重的:它的「Java」,而不是「JAVA」。這不是一個縮寫。 – Syntactic 2010-05-19 12:17:59
我不知道4或5,但是去編程面試時沒有基礎知識來回答1-3對我來說似乎很奇怪(即他們與Java無關)。 – Rhangaun 2010-05-19 12:21:15
請添加面試問題標籤。 – 2010-05-19 13:40:03