參考博客:(http://www.importnew.com/20672.html)html
聲明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();
Thread thread = new Thread(){ public void run(){ System.out.println("Thread Running"); } }; thread.start();
其實經過上面的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(); } }
new Thread(new Runnable(){ @override public void run() { System.out.println("Thread is running"); } }).start();
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(); } }
可是這裏有一個疑惑,就是輸出是一個一個出來的,也就是看上去這五個線程是同步的,之後再研究一下,這塊比較鬼繼承