成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java高并發(fā)之從零到放棄(二)

cloud / 2575人閱讀

摘要:可以用代替可以用代替定義的對象的值是不可變的今天就先到這里,大家可以看看這些內容的拓展記得點關注看更新,謝謝閱讀

前言

java高并發(fā)第二篇講的是java線程的基礎
依舊不多說廢話

線程和進程

進程是操作系統(tǒng)運行的基礎,是一個程序運行的實體,windows上打開任務管理器就能看到進程
線程是輕量級的進程,是程序執(zhí)行的最小單位,是在進程這個容器下進行的

線程基本操作
新建一個線程類有兩種方式:
extends Thread
implement Runnable

推薦使用Runnable接口(這不廢話嗎)

1.創(chuàng)建線程

Thread t1 = new Thread(){
    @Ovveride
    public void run(){
        System.out.println("create");
    }
t1.start();

重構run()方法,用start()啟動線程

2.終止線程

Thread.stop();

不推薦stop,強行終止不能保證原子性
這里給大家寫一個終止線程的推薦方法:

public class interruptTest {

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(){
            public void run(){
                while (true){
                    System.out.println("go");
                    if (Thread.currentThread().isInterrupted()){
                        break;
                    }
                }
            }
        };
        t1.start();
        Thread.sleep(10001);
        t1.interrupt();
    }
}

看懂了嗎?
方法解釋:
interrupt和stop不同的是,stop會立即中斷線程,而interrupt的中斷線程由線程自己決定

Thread.interrupt()        //設置中斷標志
Thread.isInterrupted()        //判斷當前線程是否有中斷標志,如果有,返回true

sleep()也能讓線程暫時性的中斷,即讓線程休眠

3.線程協(xié)作之等待和通知

多線程之間的協(xié)作可以使用等待(wait())和通知(notify)進行
wait和notify不能亂用,它們必須包含在synchronzied(即同步)的方法中
無論是wait還是notify,都需要一個目標對象的監(jiān)聽器(也叫鎖)

當線程1在一個同步的object對象中運行的時候,突然執(zhí)行object.wait()方法,此時線程停止執(zhí)行,并且退出object對象,釋放對象的監(jiān)聽器,線程1進入等待隊列
接著線程2進入object對象,首先拿到object對象的監(jiān)聽器,當線程2執(zhí)行object.notify()方法時,對象object會隨機選擇一個等待隊列中的線程,并將其喚醒,然后線程2釋放監(jiān)聽器,那個被喚醒的線程就會進來

用圖更形象:

4.線程協(xié)作之結束和謙讓

多線程之間的協(xié)作可以使用結束(join())和謙讓(yield())進行
join()方法就是讓一個線程加入到另一個線程,至于怎么個加入法看下面一個例子:

public class JoinTest {
    public volatile static int i=0;
    public static class JoinThread extends Thread{
        @Override
        public void run(){
            for (i=0;i<1000;i++){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        JoinThread joinThread = new JoinThread();
        joinThread.start();
        System.out.println(i);
    }
}

這個方法打印出來的i大家肯定知道,一定是0,因為我們在這個類的主線程里執(zhí)行,雖然joinThread和主線程一起執(zhí)行了,但是主線程并不會去理會joinThread,只管執(zhí)行打印代碼:

再來看看加入join()后的結果:

現(xiàn)在很容易理解了,因為joinThread線程加入到了主線程中,joinThread的join()讓主線程去等待它完成才執(zhí)行打印,所以會打印出1000

yield()是謙讓,字面意思,就是我已經完成一些最重要的事情了,不想再占著CPU資源,需要休息啊一下,但是能否被分配到CPU資源就不一定了

守護線程

守護線程是在后臺默默完成系統(tǒng)服務的線程,如垃圾回收線程,JIT線程
與之相應的是用戶線程,也就是用戶完成業(yè)務要用的線程
當一個java程序中只剩守護線程的時候,JVm就會自然退出
下面用一段代碼證明:
代碼new Thread().setDaemon(true);就是設置為守護線程

public class DaemonTest {

    public static class DaemonT extends Thread{
        public void run(){
            while (true){
                System.out.println("我還在");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                }
            }
        }
    }


    public static void main(String[] args) throws InterruptedException {
        DaemonT daemonT = new DaemonT();
        daemonT.setDaemon(true);
        daemonT.start();
        Thread.sleep(2000);
    }
}

上面代碼在主線程運行兩秒后,自動關閉應用,因為只有守護線程

線程優(yōu)先級設置

java的線程優(yōu)先級可以用1-10表示
數(shù)字越高表示優(yōu)先級越高

Thread thread1 = new Thread();
thread.setPriority(10);

這樣thread1線程的優(yōu)先級就是最高的

線程安全與synchronized

為了保證線程安全,我們之前講過可以使用volatile保證變量可見性
但是volatile并不能真正的保證線程的安全
使用synchronized保證線程安全,synchronized會在對象上加鎖
使同一時間只能有一個線程進入該對象
synchronized的用法整理:

指定加鎖對象:對給定對象加鎖,進入同步代碼前獲得給定對象的鎖
直接作用于實例方法:相當于對當前實例加鎖
直接作用于靜態(tài)(static)方法,相當于給當前類加鎖

所以要注意在同個線程指定的監(jiān)聽對象是new Test()還是test實例

Tips

HashMap的多線程編程是不安全的,可能導致機子死機,兩個線程交互next會進入死循環(huán)??梢杂肅oncurrentHashMap代替
ArrayList可以用Vector代替
Integer定義的對象的值是不可變的

今天就先到這里,大家可以看看這些內容的拓展
記得點關注看更新,謝謝閱讀

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/70635.html

相關文章

  • java并發(fā)之從零到放棄(一)

    摘要:今天就先到這里,大家可以看看這些內容的拓展記得點關注看更新,謝謝閱讀 前言 這是一個長篇博客,希望大家關注我并且一起學習java高并發(fā)廢話不多說,直接開始 并行和并發(fā) 并行:多個線程同時處理多個任務并發(fā):多個線程處理同個任務,不一定要同時 下面用圖來描述并行和并發(fā)的區(qū)別:(實現(xiàn)和虛線表示兩個不同的線程) showImg(https://segmentfault.com/img/bVYT...

    luoyibu 評論0 收藏0
  • java并發(fā)之從零到放棄(三)

    摘要:前言今天講的多線程的同步控制直接進入正題重入鎖重入鎖可以完全代替,它需要類來實現(xiàn)下面用一個簡單的例子來實現(xiàn)重入鎖以上代碼打印出來的是,可以說明也實現(xiàn)了線程同步它相比更加靈活,因為重入鎖實現(xiàn)了用戶自己加鎖,自己釋放鎖記得一定要釋放,不然其他線 前言 今天講的多線程的同步控制直接進入正題 ReentrantLock重入鎖 重入鎖可以完全代替synchronized,它需要java.util...

    FrozenMap 評論0 收藏0
  • java并發(fā)之從零到放棄(五)

    摘要:前言這篇主要來講解多線程中一個非常經典的設計模式包括它的基礎到拓展希望大家能夠有所收獲生產者消費者模式簡述此設計模式中主要分兩類線程生產者線程和消費者線程生產者提供數(shù)據和任務消費者處理數(shù)據和任務該模式的核心就是數(shù)據和任務的交互點共享內存緩 前言 這篇主要來講解多線程中一個非常經典的設計模式包括它的基礎到拓展希望大家能夠有所收獲 生產者-消費者模式簡述 此設計模式中主要分兩類線程:生產者...

    meislzhua 評論0 收藏0
  • java并發(fā)之從零到放棄(四)

    摘要:前言本篇主要講解如何去優(yōu)化鎖機制或者克服多線程因為鎖可導致性能下降的問題線程變量有這樣一個場景,前面是一大桶水,個人去喝水,為了保證線程安全,我們要在杯子上加鎖導致大家輪著排隊喝水,因為加了鎖的杯子是同步的,只能有一個人拿著這個唯一的杯子喝 前言 本篇主要講解如何去優(yōu)化鎖機制或者克服多線程因為鎖可導致性能下降的問題 ThreadLocal線程變量 有這樣一個場景,前面是一大桶水,10個...

    Alex 評論0 收藏0
  • 前端從零開始系列

    摘要:只有動手,你才能真的理解作者的構思的巧妙只有動手,你才能真正掌握一門技術持續(xù)更新中項目地址求求求源碼系列跟一起學如何寫函數(shù)庫中高級前端面試手寫代碼無敵秘籍如何用不到行代碼寫一款屬于自己的類庫原理講解實現(xiàn)一個對象遵循規(guī)范實戰(zhàn)手摸手,帶你用擼 Do it yourself!!! 只有動手,你才能真的理解作者的構思的巧妙 只有動手,你才能真正掌握一門技術 持續(xù)更新中…… 項目地址 https...

    Youngdze 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<