
建立線程的兩種方式
一)繼承Thread類,重寫run方法
1 package thread;
2
3 public class cat {
4 public static void main(String[] args) {
5 Thr cat1 = new Thr();
6 // 主線程在開啟這個線程之後,并不會阻塞在這裡,而是會繼續向下執行
7 cat1.start(); // 思考線程開啟為什麼是start而不是run方法
8 for (int i = 0; i < 10 ; i++) {
9 System.out.println("mian線程執行");
10 try {
11 Thread.sleep(1000);
12 } catch (InterruptedException e) {
13 e.printStackTrace();
14 }
15 }
16 }
17 }
18 // 繼承Thread之後,Thr類就可以看作一個線程
19 class Thr extends Thread {
20 int count = 0;
21 @Override
22 public void run() {
23 while (true) {
24 System.out.println("幹就完了" + "數量為" + (++count));
25 try {
26 Thread.sleep(1000);
27 } catch (InterruptedException e) {
28 e.printStackTrace();
29 }
30 if (count == 80) {
31 break;
32 }
33 }
34 }
35
程式中線程分析:
疑問解答: 為什麼不是run而是start?
此時的線程名為main,為串行化,而不是多線程了
源碼解讀:
1)
2)
真正實作多線程的是start0方法,是本地方法,底層是c/c++實作的
二)實作Runnable接口,重寫run方法
因為java是單繼承的,加入現在A類繼承了B類,但是想把A類當成線程來使用,此時就不能繼承Thread類了。這個時候,該Runnable接口上場表演了。這裡不能再用start( )去開啟線程了。這裡底層使用了設計模式【代理模式】
代理模式: