1.1什么是進程?什么是線程?
進程是一個應用程序(一個軟件)。線程是一個進程中的執(zhí)行場景/執(zhí)行單元。
一個進程可以啟動多個線程。
1.2對于java程序來說,當在Dos命令窗口中輸入:
java HelloWorld 回車之后。會先啟動JVM,而JVM就是一個進程。
JVM再啟動一個主線程調用main方法。
同時再啟動一個垃圾回收線程負責看護,回收垃圾。
最起碼,現(xiàn)在的java程序中至少有兩個線程并發(fā),一個是垃圾回收線程,一個是執(zhí)行main方法的主線程。
1.3進程與線程的關系?
進程可以看作是一個公司,線程可以看作是一個部門。
注意:進程A和進程B的內存獨立不共享。
線程A和線程B,堆內存和方法區(qū)內存共享。但棧內存獨立,一個線程一個棧。每個棧之間互不干擾,各自執(zhí)行各自的,這就是多線程并發(fā),多線程并發(fā)可以提高效率。
1.4分析
對于單核的CPU來說,真的可以做到真正的多線程并發(fā)嗎?
4核CPU表示同一個時間點上,可以真正的有4個進程并發(fā)執(zhí)行。
什么是真正的多線程并發(fā)?t1線程執(zhí)行t1的,t2線程執(zhí)行t2的,t1、t2不會相互影響。
單核CPU不能做到真正的多線程并發(fā)
1.5在java語言中實現(xiàn)線程有兩種方式。
java支持多線程機制,并且java已經將多線程實現(xiàn)了。我們只需要繼承。
第一種:編寫一個類,直接繼承java.lang.Thread,重寫run方法。
注意:
亙古不變的道理:方法體中的代碼永遠都是自上而下順序執(zhí)行。
第二種方式:編寫一個類,實現(xiàn)java.lang.Runnable接口,實現(xiàn)run方法。
注意:第二種方式實現(xiàn)接口比較常用,因為一個類實現(xiàn)了接口,它還可以去繼承其他的類,比較靈活。
package com.diya.java.thread;
public class ThreadTest01 {
public static void main(String[] args) {
System.out.println("main begin");
m1();
System.out.println("main over");
}
private static void m1() {
System.out.println("m1 begin");
m2();
System.out.println("m1 over");
}
private static void m2() {
System.out.println("m2 begin");
m3();
System.out.println("m2 over");
}
private static void m3() {
System.out.println("m3 execute");
}
}
package com.diya.java.thread;
/*
實現(xiàn)線程的第一種方式:
編寫一個類,直接繼承java.lang.Thread,重寫run方法。
怎么創(chuàng)建線程對象? new就行了
怎么啟動線程呢? 調用線程的start()方法
*/
public class ThreadTest02 {
public static void main(String[] args) {
//這里是main方法,這里的代碼屬于主線程,在主棧中運行。
//新建一個分支線程對象。
MyThread myThread = new MyThread();
//啟動線程
//start()方法的作用是:啟動一個分支線程,在JVM中開辟一個新的棧空間
//這段代碼任務完成之后瞬間就結束了。
//這段代碼的任務只是為了開啟一個新的棧空間
//只要新的空間開出來,start()方法就結束了。
//線程就啟動成功了
//啟動成功的線程會自動調用run方法,并且run方法在分支棧的底部(壓棧)。
//run方法在分支棧的棧底部,main方法在主棧的棧底部。run和main是平級的。
myThread.start();
//這里的代碼還是運行在主線程中。
for (int i = 0; i < 1000; i++) {
System.out.println("主線程-->" + i);
}
}
}
class MyThread extends Thread{
@Override
public void run() {
//編寫程序,這段程序運行在分支線程中。(分支棧)
for (int i = 0; i < 1000; i++) {
System.out.println("分支線程-->" + i);
}
}
}
package com.diya.java.thread;
import java.util.concurrent.ForkJoinWorkerThread;
/*
實現(xiàn)線程的第二種方式:編寫一個類實現(xiàn)java.lang.Runnable接口。
*/
public class ThreadTest03 {
public static void main(String[] args) {
//創(chuàng)建一個可運行的對象
//MyRunnable r = new MyRunnable();
//將可運行的對象封裝成一個線程對象
//Thread t = new Thread(r);
//合寫
Thread t = new Thread(new MyRunnable());
//啟動線程
t.start();
for (int i = 0; i < 100; i++) {
System.out.println("主線程-->" + i);
}
}
}
//這并不是一個線程類,是一個可運行的類,它還不是一個線程。
class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("分支線程-->" + i);
}
}
}
線程的生命周期圖(面試會問)
新建狀態(tài)
就緒狀態(tài)
運行狀態(tài)
阻塞狀態(tài)
死亡狀態(tài)
就緒狀體合運行狀態(tài)是不斷切換的

