Java線程代碼實現

線程的Java實現

參考博客:(http://www.importnew.com/20672.html)html

1.繼承Thread

聲明Thread的子類; 這種方法是建立類繼承Thread,而後重寫Thread中的run方法java

public class MyThread extends Thread {
   public void run(){
     System.out.println("MyThread running");
   }
}

稍微看一下Thread類的源碼,本來的run方法:多線程

/* What will be run. */
private Runnable target;

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

其中的target是run的任務,而新類直接繼承Thread,重寫run方法,至關於直接描述了run方法中要運行的任務。ide

運行Thread子類的方法測試

MyThread myThread = new MyThread();
myTread.start();

2.建立Thread的匿名子類

Thread thread = new Thread(){
   public void run(){
     System.out.println("Thread Running");
   }
};
thread.start();

3.實現Runnable接口

其實經過上面的Thread源碼能夠發現,實現Runnable target的構建,那麼Thread的run方法也就有了實際意義;所以另外一個多線程的寫法是新類實現Runnable接口線程

public class RunnableThread implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }

}

運行code

public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        new Thread(new RunnableThread()).start();
    }
}

4.建立實現Runnable接口的匿名類

new Thread(new Runnable(){
    @override
    public void run() {
        System.out.println("Thread is running");
    }
}).start();

5. 使用FutureTask

FutureTask實現了Runnable接口,所以FutureTask的對象也是能夠當作runner的;而FutureTask對象的構造須要填入一個實現Callable接口的對象,所以:htm

public class CallableThread implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int i = 2017;
        Thread.sleep(3000);
        System.out.println(Thread.currentThread().getName() + " " + i);
        return i;
    }
}

運行測試一下:對象

for (int i = 0; i < 5; i++) {
    FutureTask<Integer> futureTask = new FutureTask<Integer>(new CallableThread());
    new Thread(futureTask, "有返回值的線程").start();
    try {
        System.out.println(futureTask.get());
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

可是這裏有一個疑惑,就是輸出是一個一個出來的,也就是看上去這五個線程是同步的,之後再研究一下,這塊比較鬼繼承

相關文章
相關標籤/搜索