天天看點

實作多線程時繼承Thread和實作Runnable接口的差別和用法

在Java中負責線程的這個功能的是Java.lang.Thread 這個類。

1,可以通過建立 Thread 的執行個體來建立新的線程。每個線程都是通過某個特定Thread對象所對應的方法run( )來完成其操作的,方法run( )稱為線程體。通過調用Thead類的start()方法來啟動一個線程。

2,也可以通過實作Runnable接口,再重寫run方法然後建立對象,調用start()方法啟動線程。

繼承Thread類方式的缺點:如果我們的類已經從一個類繼承(如小程式必須繼承自Applet 類),則無法再繼承 Thread 類。而通過Runnable接口可以實作多線程。

其優點:可以同時實作繼承。實作Runnable接口方式要通用一些。

1)避免單繼承

2)友善共享資源 同一份資源 多個代理通路

繼承Thread的示例:

public class ThreadDemo extends Thread{
	@Override
	public void run() {
		for(int i=1;i<=1000;i++){
			System.out.println("thread:"+i);
		}
	}
	public static void main(String[] args) {
		ThreadDemo t=new ThreadDemo();
		//線程中 調用start()方法代替run()方法
		t.start();
		for(int i=1;i<=1000;i++){
			System.out.println("main:"+i);
		}
	}
}
           

實作Runnable接口的示例:

public class RunnableDemo implements Runnable {
	public void run() {
		for(int i=1;i<=1000;i++){
			System.out.println("Runnable:"+i);
		}
	}
	public static void main(String[] args) {
		RunnableDemo rd=new RunnableDemo();
		Thread t=new Thread(rd);
		t.start();
		for(int i=1;i<=1000;i++){
			System.out.println("main:"+i);
		}
	}
}
           

也可以在一個類中同時繼承和實作,比如輸出1-100之間的偶數的示例:

public class NumOne extends Thread implements Runnable{
	@Override
	public void run() {
		for (int i = 1; i <= 100; i++) {
			if (i % 2 == 0) {
				System.out.println(i);
			}
		}
	}
	public static void main(String[] args) {
		NumOne no=new NumOne();
		no.start();
		Thread t=new Thread(no);
		t.start();
	}
}