1. 程式人生 > 其它 >[Java多執行緒]併發基礎概念

[Java多執行緒]併發基礎概念

/*
 * @Author: pengLei
 * @LastEditors: pengLei
 * @Date: 2021-12-14 14:08:01
 * @LastEditTime: 2021-12-14 16:09:03
 * @motto: Still water run deep
 * @Description: 釋出者
 * @FilePath: \魚泡PC網\src\dep\publish.ts
 */
// ! 重要方法,不容刪除

/** 釋出者 */
class Publish {
  name: string
  id: number
  messageMap: { [key: string
]: {id: number; name: string; [x: string]: any}[] } /** name等同於給當前釋出者一個名稱 */ constructor(name: string) { /** 訊息事件訂閱者集合物件 */ this.messageMap = {} /** 隨機id模擬唯一 */ this.id = Date.now() + Math.ceil(Math.random() * 10000) this.name = name } /** 新增訊息訂閱者(subscriber等於訂閱者) */ addListener(subscriber: any, message:
string) { if (!subscriber || !message) return false /** 如果訊息列表不存在,就新建 */ if (!this.messageMap[message]) { this.messageMap[message] = [] } /** 比對ID查詢!!! */ const existIndex = this.messageMap[message].findIndex(exitSubscriber => exitSubscriber.id === subscriber.id) /** 不存在這個訂閱者時新增
*/ if (existIndex === -1) { /** 吧訂閱者裝進去 */ this.messageMap[message].push(subscriber) } else { /** 存在的時候呢 直接替換 */ this.messageMap[message][existIndex] = subscriber } } /** 刪除訊息訂閱者 */ removeListener(subscriber: any, message: string) { if (!subscriber) return false /** 如果傳了message只刪除此message下的訂閱關係,否則刪除此訂閱者的所有訂閱關係 */ const messages = message ? [message] : Object.keys(this.messageMap) /** 遍歷Key */ messages.forEach(_message => { const subscribers = this.messageMap[_message] if (!subscribers) return false let i = subscribers.length while (i--) { if (subscribers[i].id === subscriber.id) { subscribers.splice(i, 1) } } /** 陣列元素如果沒有了。直接吧訂閱器刪除 */ if (!subscribers.length) delete this.messageMap[_message] }) } /** 釋出通知 */ publish<D extends any>(message: string, info: D) { const subscribers = this.messageMap[message] || [] let handlerKey = message + "_" + this.id + "_handler" /** 找出當前索引訂閱者,依次傳送通知 */ subscribers.forEach(subscriber => { subscriber[handlerKey](subscriber, info) }) return this } } export default Publish
/*
 * @Author: pengLei
 * @LastEditors: pengLei
 * @Date: 2021-12-14 14:03:52
 * @LastEditTime: 2021-12-14 16:08:15
 * @motto: Still water run deep
 * @Description: 訂閱者
 * @FilePath: \魚泡PC網\src\dep\subscribe.ts
 */
// ! 重要方法,不容刪除

type listenType = {
  publisher: any,
  message: string,
  handler: (subscribe: {[x: string]: any}, info: any) => void
}

/** 訂閱者 */
class Subscribe {
  id: number;
  name: string;
  [x: string]: any
  /** name等同於給當前訂閱者一個名稱 */
  constructor(name: string = 'subscriber') {
    this.name = name
    /** 隨機id模擬唯一 */
    this.id = Date.now() + Math.ceil(Math.random() * 10000)
  }
  /** 
   *  訂閱器
   *  @publisher 訂閱的是哪個釋出者(比如你訂閱的是魚泡釋出者)
   *  @message 訂閱的訊息,(非常重要的欄位)(比如你訂閱的是魚泡發的招工資訊key。繫結關係)
   *  @handler 收到訊息後的處理方法
   */
  listen({publisher, message, handler}: listenType) {
    /** 訂閱訊息的回撥函式 */
    if (publisher) {
      /** 一個訂閱者可以同時訂閱多個釋出者,所以回撥函式要拼接上對應釋出者的id */
      this[message + '_' + publisher.id + "_handler"] = handler
      publisher.addListener(this, message)
    }
    /** 鏈式 */
    return this
  }
  /** 取消訂閱 */
  unlisten(publisher: any, message: string) {
    if (publisher) {
      publisher.removeListener(this, message)
    }
    /** 鏈式 */
    return this
  }
}

export default Subscribe

/*
 * @Author: pengLei
 * @LastEditors: pengLei
 * @Date: 2021-12-14 15:34:28
 * @LastEditTime: 2021-12-14 16:06:22
 * @motto: Still water run deep
 * @Description: 訂閱器(採集所有需要訂閱的例項)
 * @FilePath: \魚泡PC網\src\dep\listener.ts
 */
import {Subscribe, Publish} from "."

/** 示例 (可以鏈式,多繫結)說白了就是一個人可以繫結A的釋出者,也可以繫結B的釋出者,還可以繫結A的釋出其他資訊
 *  LoginSubscribe.listen({
        publisher: APublish, // 繫結釋出者是A
        message: '找活', // 繫結釋出者是釋出的找活
        handler: (self, info) => {
          console.log(self, dispatch)
        }
      }).listen({
        publisher: BPublish,
        message: '招工',
        handler: (self, info) => {
          consol.log(info == '我要找一個工人啦')
          console.log(self, dispatch)
        }
      })
    
    BPublish.publish('招工', '我要找一個工人啦!')

    如不多個人綁定了B的招工,那麼B釋出者一旦放送資訊,全體訂閱者會收到資訊
 */

/** 登入的釋出者 */
const LoginPublish = new Publish('LoginPublish')
/** 登入的訂閱者 */
const LoginSubscribe = new Subscribe('LoginSubscribe')

/** 你可以在這裡處理更多的釋出訂閱 */
// ....

export {
  LoginPublish,
  LoginSubscribe
}