發表文章

目前顯示的是 9月, 2019的文章

Java Thread和Runnable的執行差異

文章目的 了解Java多執行緒操作中,Thread和Runnable的差異 實作多個Thread 實作多個Runnable 如何實作可以參考 Java Thread的基礎實踐方法 實作多個Thread 原始碼 class MyThread extends Thread{ private int ticket = 5; public void run(){ for (int i=0;i<10;i++) { if(ticket > 0){ System.out.println("ticket = " + ticket--); } } } public static void main(String[] args){ new MyThread().start(); new MyThread().start(); new MyThread().start(); } } Result ticket = 5 ticket = 4 ticket = 3 ticket = 5 ticket = 4 ticket = 5 ticket = 3 ticket = 2 ticket = 1 ticket = 2 ticket = 4 ticket = 3 ticket = 2 ticket = 1 ticket = 1 解析 透過原始碼與結果可以看到 多執行緒的呼叫是隨機的,所以在Result階段並沒有如實的呈現規律的5~1排列 每個執行續使用的資源(ticket)都是獨一歸屬個別執行緒的。 所以假設今天的業務邏輯是,活動商要賣出五張票,如果使用了如上方一樣的三個執行緒,那結果可能會賣出15張超賣了10張 實作多個Runnable 原始碼 public class MyRunnable implements Runnable { private int ticket = 5; public void run(){ for (int i=0;i<10;i++)

Java Thread的基礎實踐方法

文章目的 讓讀者了解Java Thread的方法,目前Java Thread有三種實踐方法如下 實作Runnable介面 實作Callable介面 繼承Thread類別 實作Runnable Runnable是甚麼? Runnable是一個介面提供一個run方法,原始程式碼如下 原始碼 @FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); } 原始碼要點 @FunctinalInerface annotation是標明此介面可以透過Java8 lambda的方式去實踐 run方法沒有回傳值,代表執行後無法接收解果 實踐方法 實作runnable中的run方法,在傳入thread的建構者創建新的thread,並且執行run public class MyRunnable implements Runnable { @Override public void run() { System.out.println("Hi my name is Monster Lee");

Java List家族大解惑

前言 在學時還有工作初期,看了市面上的Java教科書發現都沒有深入探討這些List底層與關鍵要素,都只教如何使用。但這個坑常常會在面試或是追蹤效能上體現出自己的不足,所以寫一篇文章鞏固自己的觀念 目標 搞清楚List中ArrayList & LinkedList & Vector List 我目前開發最常使用的資料結構,因為ArrayList的方便性可以儲存各種物件。而真的只能用ArrayList去做這些處理嗎?如果遇到瓶頸還有甚麼解決方法呢? 接下來會以下方兩個討論去做比較 ArrayList & LinkedList ArrayList & Vector List & LinkedList 差別 實作 List的底層結構是Object陣列 LinkedList是LinkedList資料結構, 也就是在搜尋時是透過Node的連結做移動 快速隨機存取 ArrayList實作RandomAccess而LinkedList沒有 透過物件導向的概念這代表的ArrayList支持隨機存取但LinkedList沒有 LinkedList的資料結構本身是不支援隨機存取的,需要遍歷的方式才能找到元素 可以看到LinkedList原始碼繼承AbstractSequentialList就可知道它需要遍歷抓取元素 ,而ArrayList只需要給index並且直接去找出陣列中的記憶體位置就可以取得元素,可以透過下方的程式碼觀察出差別。 所以在get(index)方法中 ArrayList在正常條件下會優於LinkedList ArratList public E get(int index) { rangeCheck(index); return elementData(index); } E elementData(int index) { return (E) elementData[index]; } LinkedList public E get(int index) { checkElementIndex(index); return nod

一次搞懂POJO、PO、DTO、VO、BO

圖片
前言 在還是學生時,腦袋完全沒有所謂的Bean的觀念,直到進入職場開始使用Spring並且看到物件的命名(PO、DTO、VO、BO)才發現原來每個物件,對於他們的功能都有一個相對的命名,所以就抽空整理網路上看到的資料並且記錄下來,如果內文有錯誤的話煩請高手糾正指導。 主文 POJO (Plain Old Java Object) Martin Fowler、Rebecca Parsons和Josh MacKenzie在2000年的一次一講提出的概念,當初提出的背景是EJB過於複雜,所以想要找一個簡單的方式取代他,而現在也證明他成功了,應為套用POJO概念的Spring已經是Java不可或缺的框架。 定義 簡單並且純粹,POJO就是一個Java物件只包含自己的屬性(private)和提取或儲存這些屬性的method(get、set),而其他的Object也是以POJO為基準開始延伸。 題外話 對於一個進入正式開發階段的Java工程師在工作時常常看到Entity應該都不知道他們的正式名稱就是POJO。 下方參考 Webopedia 介紹 POJO, or Plain Old Java Object, is a normal Java object class (that is, not a JavaBean, EntityBean etc.) and does not serve any other special role nor does it implement any special interfaces of any of the Java frameworks. This term was coined by Martin Fowler, Rebbecca Parsons and Josh MacKenzie who believed that by creating the acronym POJO, such objects would have a “fancy name”, thereby convincing people that they were worthy of use. PO (persistent object) 定義 因為ORM框架的誕生所以才有PO的概念,可以簡單地將它視為資料庫table對應的