1. 程式人生 > >執行緒實現的四種方式

執行緒實現的四種方式

實現執行緒有四種方式

分別是:

  1. 方式一:繼承Thread類,重寫run方法
  2. 方式二:實現Runnable介面,實現run方法
  3. 方式三:實現Callnable介面,實現call方法
  4. 方式四:利用ExecutorService執行緒池的方式建立執行緒

下面就來一一介紹:
方式一:繼承Thread類,重寫run方法
實現方式如下:

package com.lxk.thread1;

public class TestThread extends Thread{
	@Override
	public void run() {
		System.out.println("測試執行緒!");
	}
	public static void main(String[] args) {
		TestThread t1=new TestThread();
		TestThread t2=new TestThread();
		t1.start();
		t2.start();
	}
}

方式二:實現Runnable介面,實現run方法
實現Runnable介面,實現之後還需要用Thread類進行封裝
具體實現方式如下:

package com.lxk.thread2;

public class TestThread implements Runnable{
	@Override
	public void run() {
		System.out.println("測試執行緒!");
	}
	public static void main(String[] args) {
		TestThread r=new TestThread();
		Thread t1=new Thread(r);
		Thread t2=new Thread(r);
		t1.start();
		t2.start();
	}
}

方式三:實現Callnable介面,實現call方法
Callnable介面中有聲明瞭一個方法call方法,該方法的返回型別不是void,而是Callnable介面的類泛型T
因此它是有返回值的,可以獲取到執行緒執行體的返回值
執行緒類需要實現Callnable介面,在使用的時候需要先用FutureTask類封裝執行緒類,然後用Thread類繼續封裝FutureTask類,然後呼叫start方法.
具體實現如下:

package com.lxk.thread3;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class MyThread implements Callable<Integer>{
	int i=0;
	@Override
	public Integer call() throws Exception {
		i++;
		return i;
	}
	public static void main(String[] args) throws Exception {
		Callable mt=new MyThread();
		FutureTask<Integer> ft=new FutureTask<Integer>(mt);
		Thread t=new Thread(ft);
		t.start();
		Integer integer = ft.get();//獲取到執行緒執行體的返回值
		System.out.println(integer);
	}
}

方式四:利用ExecutorService執行緒池的方式建立執行緒
該方法是jdk1.5之後才出現的,利用ExecutorService一次性建立很多個執行緒,在需要該執行緒的時候直接從該執行緒池中拿取就可以了.(池的概念可以類比jdbc連線池)
具體實現如下:

package com.lxk.thread4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyThread implements Runnable{
	
	public static void main(String[] args) throws Exception {
		ExecutorService e=Executors.newFixedThreadPool(10);
		for (int i = 0; i < 10; i++) {
			Thread t=new Thread(new MyThread());
			//執行執行緒體,那個都可以
//			t.start();
//			e.execute(t);
		}
		e.shutdown();
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("執行執行緒!");
	}
}

總結:
方式一和方式二都是沒有返回值的,實際使用的時候推薦使用方式二,因為java是面向介面程式設計的,java是單繼承多實現,面向介面程式設計可以更好的對類進行擴充套件,因此推薦使用方式二
方式三是由返回值的,如果需要獲取到執行緒執行體的返回值推薦使用方式三
方式四是執行緒池的思想,池裡面既可以放方式一和方式二建立的執行緒也可以放方式三建立的執行緒.