1. 程式人生 > >Java多線程系列一——Java實現線程方法

Java多線程系列一——Java實現線程方法

多個 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 implements
Runnable { 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實現線程方法