面試-實現多執行緒的方式
Java中實現多執行緒的方式有下面三種:
- 繼承Thread類,重寫run方法
package fs;
public class ThreadTest {
public static void main(String[] args) {
new MyThread().start();
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println("我是一個執行緒,我叫:"+Thread.currentThread().getName());
}
}
- 實現Runnable介面,重寫run方法
package fs;
public class ThreadTest {
public static void main(String[] args) {
new Thread(new MyRunnable()).start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("我是一個執行緒,我叫:"+Thread.currentThread().getName());
}
}
- 通過Callable和FutureTask建立執行緒(最終還是Thread啟動)
package fs;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
MyCallable call = new MyCallable();
FutureTask<String> task = new FutureTask<String>(call);
new Thread(task).start();
String result = task.get();
System.out.println(result);
}
}
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "Hello";
}
}
上面的三種方式的區別在哪呢?
-
實現方式不同
第一種是繼承的方式,第二種和第三種都是實現介面的方式 -
返回值
第一種和第二種有一個共同的特點就是沒有返回值,而第三種是有返回值的 -
擴充套件性
在Java中我們都知道類只能單繼承,如果我們自己建立的執行緒類是通過繼承Thread類的方法來實現的,那麼這個自定義類就不能再去擴充套件其他的類,也就是說不能再去實現更加複雜的功能。
如果我們用實現Runnable介面的方式來建立執行緒類,這樣就可以避免Java單繼承所帶來的侷限性,通過介面多實現的特性進行擴充套件。 -
資源共享/不共享
繼承的方式相當於一個執行緒只能幹一件事情,介面實現可以多個多個執行緒幹同一件事情
下面通過一段簡單的程式碼來進行講解
定義一個售票視窗類
class TicketWindow extends Thread {
int count = 100;
@Override
public void run() {
System.out.println("視窗:"+Thread.currentThread().getName() + ":賣票啦" + count--);
}
}
public class ThreadTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
for (int i = 0; i < 5; i++) {
TicketWindow t = new TicketWindow();
t.start();
}
}
}
執行結果如下:
視窗:Thread-1:賣票啦100
視窗:Thread-0:賣票啦100
視窗:Thread-2:賣票啦100
視窗:Thread-3:賣票啦100
視窗:Thread-4:賣票啦100
每個執行緒都有自己的票總量,處理的都是自己的票,就是說每個視窗各自賣各自的票,這就是繼承實現執行緒的特點,一個執行緒處理一件事情
下面來看介面實現方式的程式碼
class TicketWindow2 implements Runnable {
int count = 100;
@Override
public void run() {
System.out.println("視窗2:"+Thread.currentThread().getName() + ":賣票啦" + count--);
}
}
public class ThreadTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
TicketWindow2 t2 = new TicketWindow2();
for (int i = 0; i < 5; i++) {
new Thread(t2).start();
}
}
}
執行結果如下:
視窗2:Thread-0:賣票啦100
視窗2:Thread-3:賣票啦97
視窗2:Thread-1:賣票啦99
視窗2:Thread-2:賣票啦98
視窗2:Thread-4:賣票啦96
總共5個視窗也就是5個執行緒,執行的業務邏輯是相同的,相當於賣的是共享的票,我賣完了,你那邊就不能賣了,實際上也是這樣的,我們在12306買票就是這個邏輯,當然這邊沒有考慮到併發下票數超賣的情況。介面實現的方式可以讓多個執行緒做同一件事情。
更多技術分享請關注微信公眾號:猿天地
歡迎加入我的知識星球,一起交流技術,免費學習猿天地的課程(http://cxytiandi.com/course)
PS:目前星球中正在星主的帶領下組隊學習Spring Cloud,等你哦!
相關文章
- Java多執行緒實現方式Java執行緒
- Java實現多執行緒的三種方式Java執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 多執行緒面試題執行緒面試題
- Java建立多執行緒的幾種方式實現Java執行緒
- 關於多執行緒的兩種實現方式執行緒
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- Java之實現多執行緒的方式二:實現Runnable介面Java執行緒
- Java多執行緒之—Synchronized方式和CAS方式實現執行緒安全效能對比Java執行緒synchronized
- Linux多執行緒面試題Linux執行緒面試題
- 多執行緒面試題1執行緒面試題
- java執行緒實現方式Java執行緒
- 多執行緒面試題之多執行緒有幾種實現方案,分別是什麼執行緒面試題
- Java多執行緒的實現Java執行緒
- Java中實現執行緒的方式Java執行緒
- 一道阿里java多執行緒面試題的go版本實現阿里Java執行緒面試題Go
- Java多執行緒面試高配問題---多執行緒(3)🧵Java執行緒面試
- 多執行緒經典面試題執行緒面試題
- 面試集錦(十四)多執行緒面試執行緒
- Java面試之Java中實現多執行緒有幾種方法Java面試執行緒
- 如何實現多執行緒執行緒
- 多執行緒:繼承方式和實現方式的聯絡與區別執行緒繼承
- 【面經】多執行緒常見面試題執行緒面試題
- 敲開阿里大門的執行緒、多執行緒和執行緒池面試專題阿里執行緒面試
- Java之實現多執行緒的方式一 :繼承Thread類Java執行緒繼承thread
- 多執行緒的三種實現方式及靜態代理模式執行緒模式
- 多執行緒實現多工二執行緒
- 多執行緒實現多工一執行緒
- TestNg之XMl形式實現多執行緒測試XML執行緒
- PHP的多樣化執行方式(parallel PHP多執行緒實現,原生協程實現,多程序實現,ZTS、NTS、TS又是什麼)PHPParallel執行緒
- 3種方式實現python多執行緒併發處理Python執行緒
- Java實現多執行緒詳解一 ( 繼承Thread方式 )Java執行緒繼承thread
- 【unity】 Loom實現多執行緒UnityOOM執行緒
- JavaScript如何實現多執行緒?JavaScript執行緒
- Runnable介面實現多執行緒執行緒
- 多執行緒具體實現執行緒
- BATJ都愛問的多執行緒面試題BAT執行緒面試題