1. 程式人生 > >java多執行緒回撥方法

java多執行緒回撥方法

所謂回撥,就是客戶程式C呼叫服務程式S中的某個方法A,然後S又在某個時候反過來呼叫C中的某個方法B,對於C來說,這個B便叫做回撥方法。

下面看一個實際例子來理解:

本示例設定一個提問者,一個回答者,而回答者需要回答提問者一個很深奧的問題時,這時需要很多時間去查詢,提問者又開始做其他的事情,

等回答者找到答案後,再把答案告訴提問者

一.提問者的類

涉及到長時間的思考,要sleep,要繼承Thread

package com.xykj.thread;
public class XiaoZhang extends Thread {
    // 回答1+1,很簡單的問題不需要執行緒
    public int add(int num1, int num2) {
       return num1 + num2;
    }
 
    // 重寫run方法
    @Override
    public void run() {
       // 回答地球為什麼是圓的
       askquestion();
       super.run();
    }
 
    // 回撥介面的建立,裡面要有一個回撥方法
    //回撥介面什麼時候用呢?這個思路是最重要的
    //
   
    public static interface CallPhone {
       public void call(String question);
    }
 
    // 回撥介面的物件
    CallPhone callPhone;
 
    // 回答地球為什麼是圓的
    private void askquestion() {
       System.err.println("開始查詢資料!");
       try {
           sleep(3000);// 思考3天
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       // 把答案返回到回撥介面的call方法裡面
       if (callPhone!=null) {//提問者例項化callPhone物件,相當於提問者已經告訴我,我到時用什麼方式回覆答案
           //這個介面的方法實現是在提問者的類裡面
           callPhone.call("知道了,!!!~~~~百度有啊");
       }     
    }
}

二.提問者的類

package com.xykj.thread;
import com.xykj.thread.XiaoZhang.CallPhone;
public class MainClass {
    /**
     * java回撥方法的使用
     * 實際操作時的步驟:(以本例項解釋)
     * 1.在回答者的類內建立回撥的介面
     * 2.在回答者的類內建立回撥介面的物件,
     * 3.在提問者類裡面例項化介面物件,重寫介面方法
     * 2.-3.這個點很重要,回撥物件的例項化,要在提問者的類內例項化,然後重寫介面的方法
     * 相當於提問者先把一個聯絡方式給回答者,回答者找到答案後,通過固定的聯絡方式,來告訴提問者答案。
     * 4.呼叫開始新執行緒的start方法
     * 5.原來的提問者還可以做自己的事
     * */
    public static void main(String[] args) {
       // 小王問小張1+1=?,執行緒同步
       XiaoZhang xiaoZhang = new XiaoZhang();
       int i = xiaoZhang.add(1, 1);//回答1+1的答案
 
       // 問小張地球為什麼是圓的?回撥方法的使用
       //這相當於先定好一個返答案的方式,再來執行實際操作
      
       // 例項化回撥介面的物件
       CallPhone phone = new CallPhone() {
           @Override
           public void call(String question) {
              //回答問題者,回答後,才能輸出答案
              System.err.println(question);
           }
       };
      
       //把回撥物件賦值給回答者的回撥物件,回答問題者的回撥物件才能回答問題
       xiaoZhang.callPhone = phone;
      
       System.out.println("交代完畢!");
       //相關交代完畢之後再執行查詢操作
       xiaoZhang.start();
      
       //小王做自己的事!
       System.out.println("小王做自己的事!");
    }
 
}

執行結果

肯定是要提問者先交代完回答者怎樣的方式回答問題,

然後提問者再做自己的事,回答者開始思考答案。

這裡交代聯絡方式具體表現就是在提問者的類裡面例項化回撥介面和實現回答的方法。

相關推薦

java執行方法

所謂回撥,就是客戶程式C呼叫服務程式S中的某個方法A,然後S又在某個時候反過來呼叫C中的某個方法B,對於C來說,這個B便叫做回撥方法。 下面看一個實際例子來理解: 本示例設定一個提問者,一個回答者,而回答者需要回答提問者一個很深奧的問題時,這時需要很多時間去查詢,提問者又

Java執行之join()方法

概要 本章,會對Thread中join()方法進行介紹。涉及到的內容包括: 1. join()介紹 2. join()原始碼分析(基於JDK1.7.0_40) 3. join()示例 來源:http://www.cnblogs.com/skywang12345/p/34792

白話理解java執行之join()方法

join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * * 打醬油的例子 */ public class Demo03 { public stat

關於ros執行機制的一些內容

Multithreading behaviour with ROS AsyncSpinner   I am trying to understand how the AsyncSpinner from ROS really works because I may have some

Java學習筆記(一) Java執行 synchronized同步方法

1.提出問題-例項變數非執行緒安全 如果多個執行緒同時訪問1個物件的例項變數,則可能出現"非執行緒安全"問題。 1.1 何為非執行緒安全? 我的理解是多個執行緒對一個例項變數操作會出現值被更改,不同步的情況。 1.2 舉例 1.2.1 有私有變數的類HasPr

白話理解java執行中join()方法

join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * *

Java學習筆記(二) Java執行 synchronized同步方法-防止髒讀

1. 髒讀 在給一個物件賦值的時候進行了同步, 但是在取值的時候可能出現意外,此值已經被其他執行緒修改了,這種情況就是髒讀 1.1 PublicVar類 public class PublicVar { public String userName =

Java執行-----Thread常用方法

   1.public Thread(Runnable target,String name) 建立一個有名稱的執行緒物件 package com.thread.mothed; public class ThreadMethod {

Java執行初探——yield()方法與join()方法

一、執行緒與程序 1、程序是程式(任務)執行過程,持有資源(共享記憶體,共享檔案)和執行緒,程序是動態性的,如果程式沒有執行就不算一個程序。 2、執行緒是系統中最小的執行單元,同一程序中有多個執行緒,執行緒共享程序的資源 Java中建立現成的方式就不再贅述了,有兩種:(1

JAVA執行中join()方法的詳細分析

雖然關於討論執行緒join()方法的部落格已經非常極其特別多了,但是前幾天我有一個困惑卻沒有能夠得到詳細解釋,就是當系統中正在執行多個執行緒時,join()到底是暫停了哪些執行緒,大部分部落格給的例子看起來都像是t.join()方法會使所有執行緒都暫停並等待t的執行完畢。當然

Java執行-57-工廠方法設計模式

這篇,我們來介紹工廠方法模式。工廠方法模式和前面的簡單工廠模式區別就是,我們先定義一個Factory的介面,裡面寫一個createAnimal的方法。然後Dog就建立DogFactory工廠類,Cat就建立CatFactory工廠類。如果還有其他動物,就建立其他動物的工廠類。這樣我們就不用去修改

Java執行中join方法的理解

[CustomThread1] Thread start.      //執行緒CustomThread1起動 [CustomThread1] Thread loop at 0   //執行緒CustomThread1執行 [CustomThread1] Thread loop at 1   //執行緒Cu

Java執行中所有方法的解析

一、run()和start()   這兩個方法應該都比較熟悉,把需要並行處理的程式碼放在run()方法中,start()方法啟動執行緒將自動呼叫 run()方法,這是由Java的記憶體機制規定的。並且run()方法必須是public訪問許可權,返回值型別為void。   二

JavaJava執行中join方法的理解

[CustomThread1] Thread start.      //執行緒CustomThread1起動 [CustomThread1] Thread loop at 0   //執行緒CustomThread1執行 [CustomThread1] Thread loop at 1   //執行緒Cu

Java執行中join方法的實現

方法join的作用是使所屬的執行緒物件t正常執行run()方法中的任務,而使當前執行緒z進行阻塞,等待t銷燬後再繼續執行z後面的程式碼。 下面貼出join方法的原始碼: public final synchronized void join(long millis)

Java 執行常用操作方法

1.多執行緒常用方法:    currentThread() :  獲取當前執行的執行緒    getName() : 獲取執行緒名稱    setName() : 設定執行緒名稱    sleep(long millis) :  是一個靜態方法,使當前執行執行緒進入睡眠狀態

Jni 執行程式設計,子執行java方法

由於c++層接收到服務端主動推送tcp資料,所以存在將c++層接收到的socket資料通過層層回撥至java的需求。 以下為c++程式碼段: 1:在c++標頭檔案中定義申明相應回撥函式指標 typedef void (*SwitchStateC

Java 執行 join和interrupt 方法

簡述: 使用Java多執行緒中join和interrupt函式 《Java程式設計思想》 P669 ~ P670 一個執行緒可以再其他執行緒上呼叫join()方法,其效果是等待一段時間直到第二個執行緒結束才繼續執行。 如果某個執行緒在另一個執行緒t上呼叫t.join(), 此

Java執行-44-靜態和非靜態方法同步鎖物件是什麼

前面一篇,我們知道了synchronized關鍵字擴起來範圍的程式碼塊就可以實現同步,其實,在Java中,只需要在方法上加上synchronized關鍵字即可,就像加上static一樣。本篇來看看加上synchronized關鍵字修飾的非靜態和靜態方法的同步鎖物件是什麼。 1.非靜態同步鎖物

Java執行學習筆記(二) synchronized同步方法-防止髒讀

1. 髒讀 在給一個物件賦值的時候進行了同步, 但是在取值的時候可能出現意外,此值已經被其他執行緒修改了,這種情況就是髒讀 1.1 PublicVar類 public class PublicVar { public String userName = "wang don