線程相關(guān)

1.線程創(chuàng)建

  • 繼承Thread
  • 實現(xiàn)Runnable接口
  • 實現(xiàn)callable接口

1.1繼承Thread

 * 線程創(chuàng)建菊值,
 *  繼承Thread類拧烦,重寫run方法
 */
public class ThreadDemo1 extends Thread{

    private String name;

    public ThreadDemo1(String name){
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println("hello "+name);
    }
}

說下靜態(tài)代理:

靜態(tài)代理相關(guān):
什么是靜態(tài)代理阔蛉,

對原有對象的不滿意隙袁,想增強(qiáng)功能有三種方式

  • 繼承:繼承原有類削咆,加上更多功能得到新的類蚪拦,但是如果后來需要很多功能杖剪,會繼承很多類,層級過高
  • 包裝: 原理也是代理
  • 代理:新建一個代理類驰贷,實現(xiàn)原有接口盛嘿,對對象進(jìn)行增強(qiáng)

靜態(tài)代理:
需要有原有對象,
代理對象
公共接口

public class StaticProxy {

     public static void main(String[] args) {
         Man man = new Man("張三");
        // man.coding();

         ProxyMan proxyMan = new ProxyMan(man);
         proxyMan.coding();
     }

}

/**
 * 程序員接口括袒,敲代碼的方法
 */
interface Programer{
    void coding();
}

class Man implements Programer{
    public String name;

    public String getName() {
        return name;
    }

    public Man(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void coding() {
        System.out.println(name+"正在辛苦的敲代碼");
    }
}

class ProxyMan implements Programer{

    public Man man;

    public ProxyMan(Man man) {
        this.man = man;
    }

    @Override
    public void coding() {
        startComputer();
        System.out.println(man.getName()+"正在辛苦的敲代碼");
        closeComputer();
    }

    private void closeComputer() {
        System.out.println(man.getName()+"關(guān)閉了電腦");
    }

    private void startComputer() {
        System.out.println(man.getName()+"開啟電腦");
    }
}

1.2實現(xiàn)Runnable接口

public class ThreadDemo2 {

     public static void main(String[] args) {
         Thread one = new Thread(new Demo2("線程1"));
         one.start();
         for (int j=0;j<100;j++){
             System.out.println("zhangsan--"+j);
         }
     }
}

class Demo2 implements Runnable{
    public String name;
    public Demo2(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i =0;i<100;i++){
            System.out.println(name+"--"+i);
        }
    }
}

Thread實現(xiàn)了Runnable接口次兆,實際上是對線程的代理


image.png

1.3 實現(xiàn)Callable接口

看我這篇

2.線程狀態(tài)

它要經(jīng)過新建(New)、就緒(Runnable)锹锰、運行(Running)芥炭、阻塞(Blocked)和死亡(Dead)五種狀態(tài)

2.1 線程阻塞方法

  • join
  • sleep
  • yield

Join方式(可用于多個線程順序執(zhí)行)

public class JoinTreadDemo1 extends Thread{

    public static void main(String[] args) throws InterruptedException {

        JoinTreadDemo1 demo = new JoinTreadDemo1();
        demo.start();

        for (int j=0;j<100;j++){
            if (j==50){
                demo.join();//main線程被阻塞,當(dāng)demo這個線程結(jié)束之后才會執(zhí)行main
            }
            System.out.println("main--"+j);
        }
     }

    @Override
    public void run() {
        for (int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}

yield方式恃慧,用于暫停自己

public class YeildThreadDemo extends Thread{
     public static void main(String[] args) {
         YeildThreadDemo yeildThreadDemo = new YeildThreadDemo();
         yeildThreadDemo.start();

         for (int j=0;j<100;j++){
             if (j==50){
                 Thread.yield();
             }
             System.out.println("main--"+j);
         }
     }

    @Override
    public void run() {
        for (int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}

sleep方式园蝠,常用于模擬網(wǎng)絡(luò)延遲,或者倒計時

3. 鎖相關(guān)

3.1 模擬12306買票

10張票痢士,由三個窗口售賣彪薛,如果不加鎖,多線程情況下會出現(xiàn)假數(shù)據(jù)良瞧,賣相同的票

public class Web12306 implements Runnable {


    private int num=50;//50張票
    @Override
    public void run() {

        while (true){
            if (num<0){
                break;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"售出了第"+num+"張票");
            num--;
        }
    }
     public static void main(String[] args) {
         Web12306 web12306 = new Web12306();
         //代理類
         Thread demo1 = new Thread(web12306, "黃牛1");
         Thread demo2 = new Thread(web12306, "黃牛2");
         Thread demo3 = new Thread(web12306, "黃牛3");
         demo1.start();
         demo2.start();
         demo3.start();
     }
}

加鎖實現(xiàn)
鎖只能鎖引用類型

  • 鎖方法
  • 鎖代碼塊
  • 鎖字節(jié)碼文件

public class SynThreadDemo1 {

     public static void main(String[] args) {

         webtest web12306 = new webtest();
         //代理類
         Thread demo1 = new Thread(web12306, "黃牛1");
         Thread demo2 = new Thread(web12306, "黃牛2");
         Thread demo3 = new Thread(web12306, "黃牛3");
         demo1.start();
         demo2.start();
         demo3.start();
     }

}

class webtest implements Runnable{
    private int num=10;//50張票

    public boolean flag=true;
    @Override
    public void run() {
        while (flag){
           test3();
        }
    }
    public  void test3() {//鎖代碼塊
        synchronized (this) {
            if (num <= 0) {
                flag = false;
                return;
            }
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "售出了第" + num-- + "張票");
        }
    }
    public synchronized void test2() { //方法鎖
        if (num<=0){
            flag = false;
            return;
        }
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"售出了第"+num--+"張票");

    }

    public  void test1() { //不安全
        if (num<=0){
            flag = false;
            return;
        }
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"售出了第"+num+"張票");
        num--;
    }

}

3.2 單例模式的實現(xiàn)

單例模式

  • 餓漢模式
  • 懶漢模式
    創(chuàng)建一個靜態(tài)對象陪汽,調(diào)用靜態(tài)方法,實現(xiàn)懶加載
  • 雙重檢查
  • 靜態(tài)內(nèi)部類

public class MyJvm {

     public static void main(String[] args) {
         Jvm1 jvm1 = new Jvm1();
         Jvm1 jvm2 = new Jvm1();

         System.out.println(jvm1);
         System.out.println(jvm2);

     }

}

/**
 * 餓漢模式
 * 當(dāng)類初始化時候就會創(chuàng)建實例
 */
class Jvm1{
    private static Jvm1 jvm1 = new Jvm1();

    public static Jvm1 getInstance(){
        return jvm1;
    }

}

/**
 * 懶漢式褥蚯,當(dāng)調(diào)用方法時候才會初始化挚冤,懶加載
 */
class Jvm2{
    private static Jvm2 jvm2 = null;

    public static Jvm2 getInstance(){
        if (jvm2 == null) {
            jvm2 = new Jvm2();
        }
        return jvm2;
    }

}


/**
 * 雙重檢查
 *
 */

class Jvm3{
    private static Jvm3 jvm3 = null;

    public static Jvm3 getInstance(){
        if (jvm3 ==null){
            synchronized (Jvm3.class) {
                if (jvm3 == null) {
                    jvm3 = new Jvm3();
                }
            }
        }
        return jvm3;
    }

}

/**
 * 靜態(tài)內(nèi)部類
 */
class Jvm4{

    private static class get{
        private static Jvm3 jvm3 = new Jvm3();
    }

    public static Jvm3 getInstance(){
        return get.jvm3;
    }

}

4.Timer

定時器

定時做什么任務(wù)
倒計時案例

public class TimerDemo {

     public static void main(String[] args) throws ParseException {

         String s ="02:00:00";
         SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
         Date parse = format.parse(s);

         Timer timer = new Timer();
         timer.schedule(new TimerTask() {
             int i=1;
             @Override
             public void run() {
                 System.out.println("so easy..."+format.format(parse.getTime()-1000*i++));
             }
         },1000,1000);
     }
}

更多交流 qq群:552113611
碼云源碼:https://gitee.com/zhangqiye/Thread

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赞庶,隨后出現(xiàn)的幾起案子训挡,更是在濱河造成了極大的恐慌澳骤,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澜薄,死亡現(xiàn)場離奇詭異为肮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肤京,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門颊艳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忘分,你說我怎么就攤上這事棋枕。” “怎么了妒峦?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵重斑,是天一觀的道長。 經(jīng)常有香客問我肯骇,道長窥浪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任笛丙,我火速辦了婚禮漾脂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胚鸯。我一直安慰自己符相,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布蠢琳。 她就那樣靜靜地躺著,像睡著了一般镜豹。 火紅的嫁衣襯著肌膚如雪傲须。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天趟脂,我揣著相機(jī)與錄音泰讽,去河邊找鬼。 笑死昔期,一個胖子當(dāng)著我的面吹牛已卸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硼一,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼累澡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了般贼?” 一聲冷哼從身側(cè)響起愧哟,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奥吩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蕊梧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霞赫,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年肥矢,在試婚紗的時候發(fā)現(xiàn)自己被綠了端衰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡甘改,死狀恐怖旅东,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情楼誓,我是刑警寧澤玉锌,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站疟羹,受9級特大地震影響主守,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榄融,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一参淫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愧杯,春花似錦涎才、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跌前,卻和暖如春棕兼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抵乓。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工伴挚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灾炭。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓茎芋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜈出。 傳聞我的和親對象是個殘疾皇子田弥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 下面是Java線程相關(guān)的熱門面試題,你可以用它來好好準(zhǔn)備面試铡原。 1) 什么是線程皱蹦? 線程是操作系統(tǒng)能夠進(jìn)行運算調(diào)度...
    冰箱哥哥閱讀 519評論 0 2
  • 線程基本知識 什么是線程安全性煤杀?當(dāng)多個線程訪問某個類時,這個類始終都能表現(xiàn)出正確的行為沪哺,那么可以認(rèn)為這個類是線程安...
    Cheava閱讀 1,020評論 0 1
  • 1沈自、java中有幾種方法可以實現(xiàn)一個線程?用什么關(guān)鍵字修飾同步方法? stop()和suspend()方法為何不推...
    岳小川閱讀 376評論 0 2
  • 我懷念的辜妓,終究是小時候枯途。作為大人的我,長大以后才明白籍滴,就算成為大人酪夷,我能做的有很多,不能做的也很多孽惰。 我知道地球為...
    竹瓊閱讀 193評論 0 0
  • 認(rèn)識崇禮不能從簡單的滑雪開始(組詩) 齊鳳池 一晚岭、雨夾雪 崇禮的雨和雪花結(jié)伴 緊緊追趕秋天丟失的音符 從萬龍翻山而...
    唐山鳳池閱讀 520評論 0 0