Java多線程系列一——Java實現線程方法
阿新 • • 發佈:2017-07-08
多個 true dex extends nds one ash .get for
Java實現線程的兩種方法
- 繼承Thread類
- 實現Runnable接口
它們之間的區別如下:
1)Java的類為單繼承,但可以實現多個接口,因此Runnable可能在某些場景比Thread更適用
2)Thread實現了Runnable接口,並且有更多實用方法
3)實現Runnable接口的線程啟動時仍然需要依賴Thread
import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.junit.Assert; import org.junit.Test; /** * @Description: 線程的兩種實現方法*/ public class ThreadImplementTest { private Map<Integer, Long> map = new ConcurrentHashMap<>(); class MethodOne extends Thread { private int count = 0; @Override public void run() { map.put(++count, this.getId()); } } class MethodTwo implementsRunnable { private int count = 0; @Override public void run() { map.put(++count, Thread.currentThread().getId()); } } @Test public void textThread() { /** * 方法一:繼承Thread */ MethodOne extendsThread = new MethodOne(); extendsThread.start();/** * 方法二:實現Runnable */ MethodTwo implementsRunnable = new MethodTwo(); new Thread(implementsRunnable).start(); } @Test public void testTwoRuns() throws InterruptedException { /** * 註意:以下兩種方法啟動方式截然不同 */ Thread tmp; MethodOne extendsThread = new MethodOne(); for (int i = 0; i < 3; i++) {// 只有一個線程 tmp = new Thread(extendsThread); tmp.start(); tmp.join(); } Assert.assertTrue(map.containsKey(3)); Assert.assertTrue(map.containsKey(2)); Assert.assertTrue(map.containsKey(1)); map.clear();// 清空緩存 for (int i = 0; i < 3; i++) {// 三個不同線程 tmp = new MethodOne(); tmp.start(); tmp.join(); } Assert.assertEquals(1, map.size()); Assert.assertTrue(map.containsKey(1)); } }
Java多線程系列一——Java實現線程方法