1. 程式人生 > >java 建立執行緒的三種方法

java 建立執行緒的三種方法

在java中使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項,建立執行緒有三種方式:

1.通過繼承Thread類建立執行緒;

2.通過實現Runnable介面建立執行緒;

3.通過使用Callable和Future建立執行緒。

建立執行緒demo

1.繼承Thread類建立執行緒:定義子類繼承Thread類 -> 重寫該子類的run()方法,run()方法的方法體即執行緒需要執行的任務 -> 建立Thread子類的例項(建立執行緒物件) -> 呼叫執行緒start()方法,啟動執行緒。

如:建立兩個執行緒,分別輸出1~10.

public class ThreadTest {
    public static void main(String[] args){
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        t1.start();
        t2.start();
    }
}
class MyThread extends Thread{
    public void run(){
        for(int i = 1; i <= 10; i++){
            System.out.println(i);
            System.out.println(Thread.currentThread());
        }
    }
}

2.實現Runnable介面建立執行緒:定義Runnable介面實現類 -> 重寫該類的run()方法 -> 建立Runnable實現類的例項 -> 建立Thread物件(真正的執行緒物件) -> 呼叫執行緒start()方法,啟動執行緒。這種方式將執行緒物件和執行緒任務物件分隔開,降低了耦合性,便於維護。

如:編寫一個執行緒,實現視窗顏色變化。

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException {
        MyRunnable r = new MyRunnable();
        r.setSize(200, 200);
        r.setVisible(true);
        r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Thread thread = new Thread(r);
        thread.start();
    }
}
class MyRunnable extends JFrame implements Runnable {
    public void run(){
        int i = 0;
        JPanel panel = new JPanel();
        panel.setSize(200, 200);
        this.setContentPane(panel);
        while (true){
            i = i == 0 ? 1 : 0;
            if(i == 0){
                panel.setBackground(Color.BLACK);
            }else {
                panel.setBackground(Color.WHITE);
            }
        }
    }
}

3.使用Callable和Future建立執行緒:定義Callable介面實現類 -> 重寫call()方法 -> 建立該實現類例項 -> 使用Future Task類包裝Callable物件 -> 建立Thread物件 -> 呼叫執行緒start()方法,啟動執行緒 -> 呼叫FutureTask物件get()方法獲得子執行緒執行結束後的返回值。

public class ThreadTest {
    public static void main(String[] args){
        MyCallableThread ct = new MyCallableThread();
        FutureTask<Integer> ft = new FutureTask<Integer>(ct);
        try {
            //獲取執行緒返回值
            System.out.println("子執行緒的返回值:" + ft.get());
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}
class MyCallableThread implements Callable<Integer> {
    public Integer call() throws Exception{
        int i;
        for(i = 1; i <= 10; i++){
            System.out.println(i);
        }
        return i;
    }
}