多线程理解及面试
1、什么是進城和線程?
進程:每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1--n個線程。(進程是資源分配的最小單位)
線程:同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器(PC),線程切換開銷小。(線程是cpu調度的最小單位)
2、為什么用多線程?
隨著計算機的發展,對CPU的要求越來越高,進程之間的切換開銷較大,已經無法滿足越來越復雜的程序的要求了。于是就發明了線程,線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。一個進程可以有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。一個標準的線程由線程ID、當前指令指針(PC)、寄存器和堆棧組成。而進程由內存空間(代碼、數據、進程空間、打開的文件)和一個或多個線程組成。而進程的切換相對線程的切換消耗大很多。
3、java怎么使用多線程?
在java中要想實現多線程,有三種方法,一是繼承Thread類,二是實現Runable接口,三是實現Callable接口,并與Future、線程池結合使用(該方法使用較少,有興趣看這里Java并發編程與技術內幕:Callable、Future、FutureTask、CompletionService?)
說明: 在啟動的多線程的時候,需要先通過Thread類的構造方法Thread(Runnable target) 構造出對象,然后調用Thread對象的start()方法來運行多線程代碼。 實際上所有的多線程代碼都是通過運行Thread的start()方法來運行的。因此,不管是擴展Thread類還是實現Runnable接口來實現多線程,最終還是通過Thread的對象的API來控制線程的,熟悉Thread類的API是進行多線程編程的基礎。 面試題1:java實現線程的方法有幾種?Thread和Runable的區別?實現Runnable接口比繼承Thread類所具有的優勢:
1):適合多個相同的程序代碼的線程去處理同一個資源
2):可以避免java中的單繼承的限制
3):增加程序的健壯性,代碼可以被多個線程共享,代碼和數據獨立
//通過Runnable接口實現 class MyThread implements Runnable {private int ticket = 10;@Overridepublic void run() {for(int x = 0; x < 100; x++) {if(this.ticket > 0) {System.out.print("賣票," + this.ticket --);}} } }public class TestDemo{public static void main(String[] args) {MyThread mt = new MyThread();new Thread(mt).start();new Thread(mt).start();new Thread(mt).start();} }//通過繼承Thread實現多線程,未能實現數據共享 class MyThread extends Thread {private int ticket = 10;@Overridepublic void run() {for(int x = 0; x < 100; x++) {if(this.ticket > 0) {System.out.print("賣票," + this.ticket --);}}} }public class TestDemo{public static void main(String[] args) {MyThread mt1 = new MyThread();MyThread mt2 = new MyThread();MyThread mt3 = new MyThread();mt1.start();mt2.start();mt3.start();} }
?
4):線程池只能放入實現Runable或callable類線程,不能直接放入繼承Thread的類
?
面試題2: 一個JVM進程啟動的時候至少啟動幾個線程?
至少啟動兩個線程,一是,main線程,程序的主要執行,以及啟動子線程; 二是GC線程,用于垃圾收集;
轉載于:https://www.cnblogs.com/zhou2lin/p/8636387.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: Docker服务启动时报错:Job fo
- 下一篇: Linux日常运维管理技巧(四)文件同步