* 進程:
* 正在運行的程序,是系統進行資源分配和調用的獨立單位。
* 每個進程都有它本身的內存空間和系統資源。
* 線程:
* 是進程中的單個順序控制流,是一條執行路徑
* 一個進程若是隻有一條執行路徑,則稱爲單線程程序。
* 一個進程若是有多條執行路徑,則稱爲多線程程序。java
2種方式啓動多線程面試
* 方式1:繼承Thread類。
* 步驟
* A:自定義類MyThread繼承Thread類。
* B:MyThread類裏面重寫run()?
* 爲何是run()方法呢?
* C:建立對象
* D:啓動線程多線程
MyThread my = new MyThread(); // 啓動線程 // my.run(); // my.run(); // 調用run()方法爲何是單線程的呢? // 由於run()方法直接調用其實就至關於普通的方法調用,因此你看到的是單線程的效果 // 要想看到多線程的效果,就必須說說另外一個方法:start() // 面試題:run()和start()的區別? // run():僅僅是封裝被線程執行的代碼,直接調用是普通方法 // start():首先啓動了線程,而後再由jvm去調用該線程的run()方法。 // MyThread my = new MyThread(); // my.start(); // // IllegalThreadStateException:非法的線程狀態異常 // // 爲何呢?由於這個至關因而my線程被調用了兩次。而不是兩個線程啓動。 // my.start(); // 建立兩個線程對象 MyThread my1 = new MyThread(); MyThread my2 = new MyThread(); my1.start(); my2.start();
/* * 該類要重寫run()方法,爲何呢? * 不是類中的全部代碼都須要被線程執行的。 * 而這個時候,爲了區分哪些代碼可以被線程執行,java提供了Thread類中的run()用來包含那些被線程執行的代碼。 */ public class MyThread extends Thread { @Override public void run() { // 本身寫代碼 // System.out.println("好好學習,每天向上"); // 通常來講,被線程執行的代碼確定是比較耗時的。因此咱們用循環改進 for (int x = 0; x < 200; x++) { System.out.println(x); } }
用對象設置名稱jvm
MyThread my1 = new MyThread("林青霞"); MyThread my2 = new MyThread("劉意");
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
// //調用方法設置名稱
my1.setName("林青霞");
my2.setName("劉意");
thread中的方法ide
public class MyThread extends Thread { public MyThread() { } public MyThread(String name){ super(name); }
@Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(Thread.currentThread().getName() + ":" + x); } } }
第二種方式學習
MyRunnable my = new MyRunnable(); // 建立Thread類的對象,並把C步驟的對象做爲構造參數傳遞 // Thread(Runnable target) // Thread t1 = new Thread(my); // Thread t2 = new Thread(my); // t1.setName("林青霞"); // t2.setName("劉意"); // Thread(Runnable target, String name) Thread t1 = new Thread(my, "林青霞"); Thread t2 = new Thread(my, "劉意");
接口類爲spa
public class MyRunnable implements Runnable { @Override public void run() { for (int x = 0; x < 100; x++) { // 因爲實現接口的方式就不能直接使用Thread類的方法了,可是能夠間接的使用 System.out.println(Thread.currentThread().getName() + ":" + x); } } }