1. 程式人生 > >Java 執行緒之Thread,Runnable,Callable

Java 執行緒之Thread,Runnable,Callable

Java 中實現多執行緒有三種方法:

(1): 繼承Thread 類,覆蓋run() 方法。在run() 方法中不可拋異常,無返回值。

(2): 實現 Runnable介面,實現 其中的run() 方法。同(1) run() 不可拋異常,且無返回值。

(3):實現Callable<T>介面,介面中要覆蓋的方法是 public <T> call(),該方法可以丟擲拋異常, 且可帶返回值.

對於前兩種方法,小白們應該知曉具體用法,引用其他帖子,闡述的淺顯易懂,具體如下:

一種是繼承Thread類,一種是實現Runnable介面;Thread類是在java.lang包中定義的。一個類只要繼承了Thread類同時覆寫了本類中的run()方法就可以實現多執行緒操作了,但是一個類只能繼承一個父類,這是此方法的侷限,

  下面看例子:

package org.thread.demo;

class MyThread extends Thread{

private String name;

public MyThread(String name) {

super();

this.name = name;

}

public void run(){

for(int i=0;i<10;i++){

System.out.println("執行緒開始:"+this.name+",i="+i);

}

}

}

package org.thread.demo;

public class ThreadDemo01 {

public static void main(String[] args) {

MyThread mt1=new MyThread("執行緒a");

MyThread mt2=new MyThread("執行緒b");

mt1.run();

mt2.run();

}

}

  但是,此時結果很有規律,先第一個物件執行,然後第二個物件執行,並沒有相互執行。在JDK的文件中可以發現,一旦呼叫start()方法,則會通過JVM找到run()方法。下面啟動

start()方法啟動執行緒:

package org.thread.demo;

public class ThreadDemo01 {

public static void main(String[] args) {

MyThread mt1=new MyThread("執行緒

a");

MyThread mt2=new MyThread("執行緒b");

mt1.start();

mt2.start();

}

};這樣程式可以正常完成互動式執行。那麼為啥非要使用start();方法啟動多執行緒呢?

  在JDK的安裝路徑下,src.zip是全部的java源程式,通過此程式碼找到Thread中的start()方法的定義,可以發現此方法中使用了private native void start0();其中native關鍵字表示可以呼叫作業系統的底層函式,那麼這樣的技術稱為JNI技術(Java NativeInterface)

  ·Runnable介面

  在實際開發中一個多執行緒的操作很少使用Thread類,而是通過Runnable介面完成。

public interface Runnable{

public void run();

}

  例子:

package org.runnable.demo;

class MyThread implements Runnable{

private String name;

public MyThread(String name) {

this.name = name;

}

public void run(){

for(int i=0;i<100;i++){

System.out.println("執行緒開始:"+this.name+",i="+i);

}

}

};

  但是在使用Runnable定義的子類中沒有start()方法,只有Thread類中才有。此時觀察Thread類,有一個構造方法:publicThread(Runnable targer)此構造方法接受Runnable的子類例項,也就是說可以通過Thread類來啟動Runnable實現的多執行緒。(start()可以協調系統的資源):

package org.runnable.demo;

import org.runnable.demo.MyThread;

public class ThreadDemo01 {

public static void main(String[] args) {

MyThread mt1=new MyThread("執行緒a");

MyThread mt2=new MyThread("執行緒b");

new Thread(mt1).start();

new Thread(mt2).start();

}

}

  · 兩種實現方式的區別和聯絡:

  在程式開發中只要是多執行緒肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比

  繼承Thread類有如下好處:

->避免點繼承的侷限,一個類可以繼承多個介面。

->適合於資源的共享

  以賣票程式為例,通過Thread類完成:

package org.demo.dff;

class MyThread extends Thread{

private int ticket=10;

public void run(){

for(int i=0;i<20;i++){

if(this.ticket>0){

System.out.println("賣票:ticket"+this.ticket--);

}

}

}

};

  下面通過三個執行緒物件,同時賣票:

package org.demo.dff;

public class ThreadTicket {

public static void main(String[] args) {

MyThread mt1=new MyThread();

MyThread mt2=new MyThread();

MyThread mt3=new MyThread();

mt1.start();//每個執行緒都各賣了10張,共賣了30張票

mt2.start();//但實際只有10張票,每個執行緒都賣自己的票

mt3.start();//沒有達到資源共享

}

}

  如果用Runnable就可以實現資源共享,下面看例子:

package org.demo.runnable;

class MyThread implements Runnable{

private int ticket=10;

public void run(){

for(int i=0;i<20;i++){

if(this.ticket>0){

System.out.println("賣票:ticket"+this.ticket--);

}

}

}

}

package org.demo.runnable;

public class RunnableTicket {

public static void main(String[] args) {

MyThread mt=new MyThread();

new Thread(mt).start();//同一個mt,但是在Thread中就不可以,如果用同一

new Thread(mt).start();//個例項化物件mt,就會出現異常

new Thread(mt).start();

}

};

  雖然現在程式中有三個執行緒,但是一共賣了10張票,也就是說使用Runnable實現多執行緒可以達到資源共享目的。

Runnable介面和Thread之間的聯絡:

public class Thread extends Object implements Runnable

  發現Thread類也是Runnable介面的子類。

第三種如何執行呢  Callable介面在util.concurrent包中,由執行緒池提交 import java.util.concurrent.*; ExecutorService e = Executors.newFixedThreadPool(10); 引數表示最多可以執行幾個執行緒 e.submit(); 這個裡面引數傳 實現Callable介面那個類的物件

相關推薦

Java 執行ThreadRunnableCallable

Java 中實現多執行緒有三種方法:(1): 繼承Thread 類,覆蓋run() 方法。在run() 方法中不可拋異常,無返回值。(2): 實現 Runnable介面,實現 其中的run() 方法。

Java執行 Thread VS Runnable 【帶案例】

為此,我們舉個例子,假設有火車站有三個視窗,在賣火車票,總共只有5張票。每一個執行緒相當於一個視窗,分別售票 <strong>package com.thread; class my

執行相關 ThreadRunnableCallable、Futrue類關係與區別

Java中存在Runnable、Callable、Future、FutureTask這幾個與執行緒相關的類或者介面,在Java中也是比較重要的幾個概念,我們通過下面的簡單示例來了解一下它們的作用於區別。 Runnable 其中Runnable應該是我們最熟悉的介面,它只有一

java執行wait()notify()notifyAll()synchronized(obj){}join()

wait(),notify(),notifyAll(),synchronized wait()和notify()是java.lang.Object的物件方法,synchronized是java關鍵字;wait()和notify()必須配合synchronized

Java執行釋放鎖釋放資源釋放CPU

多執行緒中的wait與sleep到底誰釋放了鎖 首先,多執行緒中會使用到兩個延遲的函式,wait和sleep。 wait是Object類中的方法,而sleep是Thread類中的方法。 sleep是Thread類中的靜態方法。無論是在a執行緒中呼叫b的sl

面試官:都說阻塞 I/O 模型將會使執行休眠為什麼 Java 執行狀態卻是 RUNNABLE

摘要: 原創出處 https://studyidea.cn 「公眾號:程式通事 」歡迎關注和轉載,保留摘要,謝謝! 使用 Java 阻塞 I/O 模型讀取資料,將會導致執行緒阻塞,執行緒將會進入休眠,從而讓出 CPU 的執行權,直到資料讀取完成。這個期間如果使用 jstack 檢視執行緒狀態,卻可以發

Java執行Thread中的六種狀態說明

Java多執行緒之Thread中的六種狀態說明 六種狀態 執行緒流程圖 檢視JVM中對應的執行緒 六種狀態 在Java的可以通過Thead.getState()獲取當前執行緒的狀態,返回的資料型別是在Thread.

併發程式設計執行基礎-ThreadRunnable的區別及聯絡(二)

上篇文章講述了建立執行緒的常用方式 本篇主要分析一下Thread和Runnable兩種方式建立執行緒的區別及聯絡 聯絡: ▶Thread類實現了Runable介面。 ▶都需要重寫裡面Run方法。 區別: ▶Thread方式不支援多繼承,Runnable方式支援多個實現 ▶Runnable更容易實

Java執行的實現(程序與執行的概念、Java繼承Thread類實現多執行Java實現Runnable介面實現多執行ThreadRunnable的區別、實現Callable介面實現多執行

1 程序與執行緒 1.1 程序與執行緒的概念 什麼是程序?   程序: 作業系統中一個程式的執行週期。(比如我們想要在電腦上登入QQ,從雙擊qq按鈕---->關閉qq這個過程就是一個程序)   多程序: 同一時刻跑多個程式。   在DOS(磁碟作業系統時

java執行 Thread

參考部落格 Java多執行緒學習(總結很詳細!!!) 根據java 8關於thread的介紹: 有兩種方法可以建立執行緒 第一種是繼承Thread ,需要重寫Thread的run方法 class PrimeThread extends Thread { long minP

Java執行池的使用方式核心執行原理、以及注意事項

Java執行緒池的使用方式,核心執行原理、以及注意事項 執行緒池的緣由 執行緒池的處理流程 執行緒池的使用(ThreadPoolExecutor) 執行緒池的注意事項 執行緒池的緣由 java中為了提高併發度,可以使用多執行緒共同

java個人學習筆記16(多執行+extends Thread+implements Runnable

1.多執行緒 程序:正在執行的應用程式在記憶體中分配的空間 執行緒:是程序中負責程式執行的執行單元,也稱執行路徑 一個程序中至少有一個執行緒在負責該程序的執行 多執行緒技術:解決多部分程式碼同時執行的需求,合理使用cpu資源,提高使用者體驗。(微觀上序列,並未實際上提高效率

Android開發執行程式設計ThreadRunnable使用

Android可有兩種方式實現多執行緒,一種是繼承Thread類,一種是實現Runnable介面;前者只要繼承了Thread類同時覆寫了本類中的run()方法就可以實現多執行緒操作了,但是Java中一個類只能繼承一個父類,這是這種方式的侷限性,後者只需要實現一個介面而已,

Java執行Thread

執行緒的定義 是作業系統進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。 一個執行緒指的是程序中一個單一順序的控制流,一個程序中可以並行多個執行緒,每條執行緒並行執行不同的任務。 每個執行緒都有一個優先順序,預設是5(1~10,值越大,優

Java 執行Thread)技術與深入理解

Thread基礎部分 在各種程式語言中都有thread(執行緒)技術,執行緒保證在一個main中(主執行緒)可以同時進行兩個或多個不同的事件,通俗點說就是你在上廁所的同時還可以玩手機,是吧!美滋滋。而Thread就相當於提供了同時做兩件事的條件和環境。接下來在深入一點理解計算機中的Threa

java 執行執行狀態

java執行緒狀態 1. 初始(NEW):新建立了一個執行緒物件,但還沒有呼叫start()方法。 2. 執行(RUNNABLE): Java執行緒中將就緒(ready)和執行中(running)兩種狀態籠統的稱為“執行”。 執行緒物件建立後,其他執行緒(比如main執行緒)呼叫了該物件

Java執行semaphore和Exchanger

Semaphore是Java執行緒的一個計數訊號量。我們可用於多執行緒的併發訪問控制。 就像我們常見的執行緒池,資料庫連線池就可以使用Semaphore進行邏輯的實現。Semaphore中我們就介紹兩個最常用的兩個方法。 acquire() 從Semaphore獲取許可,如果計數不小於0

Java執行非同步回撥(Callback)

●介紹      有時候執行一個任務需要很長時間,單執行緒下執行緒會處於阻塞狀態。這個時候我們會考慮一種非阻塞的處理模式。非阻塞任務在任何程式語言裡都必不可少,Java也不例外。多執行緒就是一個很好的解決辦法。     

java執行Latch設計模式見解

CountDownLatch :(個人理解)使用閥門值,直到閥門值為0之前,一直阻塞執行緒。實則使用物件鎖,不釋放物件鎖,一直佔用資源,(這裡是一個缺點)。閥門值為0時,呼叫釋放物件鎖的方法,釋放資源。應用的場景,我覺得是需要一些執行緒先完成的前提下,再使用其他執行緒。也就是我就是要一些重要的執行緒

#多執行學習——ThreadRunnable的區別

常用的多執行緒的實現方式有兩種——繼承Thread類、實現Runnable介面 那他們的區別是什麼呢? 1.Runnalble具有更好的拓展性 Thread 是類,而Runnable是介面(Thread