進程與線程的區別
進程
進程簡單的來說就是在內存中運行的應用程序,一個進程可以啟動多個線程。
比如在windows中一個運行EXE文件就是一個進程。
線程
同一個線程中的進程共用相同的地址空間,同時共享進程所擁有的內存和其他資源。
線程Demo-繼承Thread類
首先我們我們繼承java.lang.Thread類來創建線程。
public class TestThread {
public static void main(String[] args) {
System.out.println("主線程ID是:" + Thread.currentThread().getId());
MyThread my = new MyThread("線程1");
my.start() ;
MyThread my2 = new MyThread("線程2") ;
/**
* 這里直接調用my2的run()方法。
*/
my2.run() ;
}
}
class MyThread extends Thread {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("名字:" + name + "的線程ID是="
+ Thread.currentThread().getId());
}
}
主線程ID是:1
名字:線程2的線程ID是=1
名字:線程1的線程ID是=9
線程Demo-實現Runnable接口
除了繼承java.lang.Thread類之外,我們還可以實現java.lang.Runnable接口來創建線程。
public class TestRunnable {
public static void main(String[] args) {
System.out.println("主線程的線程ID是"+Thread.currentThread().getId());
MyThread2 my = new MyThread2("線程1") ;
Thread t = new Thread(my) ;
t.start() ;
MyThread2 my2 = new MyThread2("線程2") ;
Thread t2 = new Thread(my2) ;
/**
* 方法調用,并不會創建線程,依然是主線程
*/
t2.run() ;
}
}
class MyThread2 implements Runnable{
private String name ;
public MyThread2(String name){
this.name = name ;
}
@Override
public void run() {
System.out.println("線程"+name+"的線程ID是"+Thread.currentThread().getId());
}
}
主線程的線程ID是1
線程線程2的線程ID是1
線程線程1的線程ID是9
優雅的終止線程
有三種方法可以終止線程,如下:
- 使用退出標識,使線程正常的退出,也就是當run()方法完成后線程終止。
- 使用stop()方法強行關閉,這個方法現在已經被廢棄,不推薦使用
- 使用interrupt()方法終止線程。
java多線程思維圖
Paste_Image.png