線程和進程——入門

什麼是進程,什麼是線程?

進程:進程是程序的一次執行,是系統進行資源分配和調度的獨立單位。每個進程都有它本身的內存空間和系統資源。
線程:是進程的一個執行單元,是進程內科調度實體,比進程更小的獨立運行的基本單位。一個進程在其執行的過程當中能夠產生多個線程,與進程不一樣的是同類的多個線程共享進程的堆和方法區資源,但每一個線程有本身的程序計數器、虛擬機棧和本地方法棧,因此係統在產生一個線程,或是在各個線程之間做切換工做時,負擔要比進程小得多,所以線程也被稱爲輕量級進程。
一個程序至少一個進程,一個進程至少一個線程。java

clipboard.png

進程線程的區別

  1. 地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間。
  2. 資源擁有:同一進程內的線程共享本進程的資源,可是進程之間的資源是獨立的。
  3. 一個進程崩潰後,在保護模式下不會對其餘進程產生影響,可是一個線程崩潰整個進程都死掉。因此多進程要比多線程健壯。
  4. 進程切換時,消耗的資源大,效率高。因此涉及到頻繁的切換時,使用線程要好於進程。一樣若是要求同時進行而且又要共享某些變量的併發操做,只能用線程不能用進程。
  5. 執行過程:每一個獨立的進程程有一個程序運行的入口、順序執行序列和程序入口。可是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
  6. 線程是處理器調度的基本單位,可是進程不是。
  7. 進程是並行的,線程是併發的

並行與併發

  • 並行:
    並行性是指同一時刻內發生兩個或多個事件,是在不一樣實體上的多個事件
  • 併發:

併發性是指同一時間間隔內發生兩個或多個事件,是在同一實體上的多個事件git

Java實現多線程

  • 繼承Thread,重寫run方法github

    public class MyThread extends Thread {
        @Override
        public void run() {
            for (int x = 0; x < 200; x++) {
                System.out.println(x);
            }
        }
    
    }
    public class MyThreadDemo {
        public static void main(String[] args) {
            // 建立兩個線程對象
            MyThread my1 = new MyThread();
            MyThread my2 = new MyThread();
    
            my1.start();
            my2.start();
        }
    }
  • 實現Runnable接口,重寫run方法多線程

    public class MyRunnable implements Runnable {
    
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                System.out.println(x);
            }
        }
    
    }
    public class MyRunnableDemo {
        public static void main(String[] args) {
            // 建立MyRunnable類的對象
            MyRunnable my = new MyRunnable();
    
            Thread t1 = new Thread(my);
            Thread t2 = new Thread(my);
    
            t1.start();
            t2.start();
        }
    }

通常使用實現Runnable接口併發

jvm虛擬機的啓動是單線程的仍是多線程的?

是多線程的。不單單是啓動main線程,還至少會啓動垃圾回收線程的jvm

併發基礎筆試題

這是github上一位大佬整理的,我的以爲很棒
併發基礎筆試題ide

相關文章
相關標籤/搜索