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

資訊專欄INFORMATION COLUMN

java 多線程

IamDLY / 3453人閱讀

摘要:總結(jié)創(chuàng)建線程,方法運(yùn)行線程。創(chuàng)建線程使用繼承類實(shí)現(xiàn)創(chuàng)建線程文檔該類必須重寫方法。為新線程的入口點(diǎn)。中斷線程它表示一個(gè)線程被中斷,會(huì)拋出錯(cuò)誤。

java多線程

關(guān)于內(nèi)存

每個(gè)線程會(huì)有自己的線程棧,即,變量不能共享,只能傳值拷貝
每個(gè)線程new出的對(duì)象全都保存在堆中,全部共享

線程的生命周期

線程具有5種狀態(tài),即新建,就緒,運(yùn)行,阻塞,死亡。
新建,當(dāng)new出來一個(gè)線程以后,jvm為其分配內(nèi)存空間,并初始化成員變量的值
就緒,當(dāng)線程調(diào)用了strat()方法的時(shí)候,線程就緒,會(huì)為其創(chuàng)建方法調(diào)用棧和程序計(jì)數(shù)器。

方法調(diào)用棧 即,記錄方法調(diào)用的次數(shù)
程序計(jì)數(shù)器 存放下一條單元指令的地方

運(yùn)行;就緒狀態(tài)獲得cpu,開始執(zhí)行run()方法
阻塞:例如進(jìn)入I/O操作

新建,就緒

使用new關(guān)鍵字創(chuàng)建一個(gè)線程以后,該線程處于新建狀態(tài),和其他java線程一樣,僅僅由java虛擬機(jī)為其分配內(nèi)存,初始化變量成員的值。

運(yùn)行和阻塞 線程調(diào)度

桌面和服務(wù)器使用搶占式調(diào)度策略,小型設(shè)備使用協(xié)作式調(diào)度策略,

線程阻塞

線程使用sleep()方法主動(dòng)放棄所占用的處理器資源。
線程調(diào)用阻塞式I/O方法,方法被返回前,阻塞
線程等待通知
線程調(diào)用suspend()掛起

解除阻塞

依依對(duì)應(yīng)即可

線程優(yōu)先級(jí)

普通5,低1,高10
默認(rèn)是5

關(guān)于start和run

start創(chuàng)建一個(gè)線程,由于是時(shí)間片運(yùn)行的,所以需要run方法進(jìn)行運(yùn)行。
總結(jié)
start創(chuàng)建線程,run方法運(yùn)行線程。

創(chuàng)建線程 使用Thread繼承類實(shí)現(xiàn)創(chuàng)建線程

文檔 https://docs.oracle.com/javas...
該類必須重寫run方法。為新線程的入口點(diǎn)。
必須調(diào)用start()方法才能運(yùn)行。

本質(zhì)上是Runnable接口的一種實(shí)現(xiàn)
package demo2;

public class test {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)線程
        ThreadDemo run1 = new ThreadDemo();
        run1.start();// 啟動(dòng)線程
        // 在運(yùn)行線程以后,會(huì)不定時(shí)的jvm調(diào)用run方法,進(jìn)行運(yùn)行
    }
}
package demo2;

public class ThreadDemo extends Thread{
    public ThreadDemo() {
        System.out.println("hello world");
    }
    
    public void run() {
        System.out.println("線程進(jìn)入");
        for(int i = 0; i > 10; i++) {
            System.out.println("輸出內(nèi)容");
        }
        System.out.println("線程執(zhí)行完畢");
    }
}

事實(shí)上父類的start方法也可以重寫

package demo2;

public class ThreadDemo extends Thread{
    public ThreadDemo() {
        System.out.println("hello world");
    }
    
    public void run() {
        System.out.println("線程進(jìn)入");
        for(int i = 0; i > 10; i++) {
            System.out.println("輸出內(nèi)容");
        }
        System.out.println("線程執(zhí)行完畢");
    }
    
    public void start() {
        System.out.println("啟動(dòng)線程");
        this.run();
    }
}

然后測(cè)試類

package demo2;

public class test {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)線程
        ThreadDemo run1 = new ThreadDemo();
        run1.start();// 啟動(dòng)線程
    }
}
Thread方法 public final void setDaemon(boolean on)

用于標(biāo)記守護(hù)線程和用戶線程
用戶線程,平常創(chuàng)建的普通線程
守護(hù)線程,服務(wù)于用戶線程,不需要上層調(diào)用,例如gc垃圾回收為一個(gè)明顯的守護(hù)線程,mysql中也有執(zhí)行定時(shí)任務(wù)的線程。

中斷線程

它表示一個(gè)線程被中斷,會(huì)拋出錯(cuò)誤。

使用Runnable接口

文檔https://docs.oracle.com/javas...
屬于java.lang包內(nèi)的,為自動(dòng)默認(rèn)加載的
該接口具有一個(gè)run方法,run方法為程序的入口
必須通過Thread類的構(gòu)造方法實(shí)現(xiàn)啟動(dòng)線程

package demo2;

public class test {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)線程
        demoRunnable r1 = new demoRunnable();
        // 使用Thread類的構(gòu)造方法傳入線程,并起名,然后運(yùn)行
        new Thread(r1, "name").start();// 創(chuàng)建完成線程以后,調(diào)用start啟動(dòng)線程
    }
}
package demo2;

public class demoRunnable implements Runnable{
    private int i;

    // 下方的為運(yùn)行的線程
    @Override
    public void run() {
        for(int i = 0; i < 100; i++) {
            System.out.println("運(yùn)行線程 " + i);
        }
    }
}
通過Callable和Future來創(chuàng)建線程

使用Callable創(chuàng)建接口的實(shí)現(xiàn)類
接口源碼如下

@FunctionalInterface
public interface Callable {
    V call() throws Exception;
}

實(shí)現(xiàn)了一個(gè)泛型,該并且返回該類型,需要實(shí)現(xiàn)call方法。使用包裝對(duì)象

關(guān)于包裝類型,即,將不是對(duì)象的內(nèi)容包裝成為對(duì)象,為包裝類型,實(shí)現(xiàn)了對(duì)象的類型,為一個(gè)類

先實(shí)現(xiàn)Callable接口,其中的call類為程序的子線程的執(zhí)行體

package demo2;

import java.util.concurrent.Callable;

public class CallableDemo implements Callable{
    @Override
    public Integer call() throws Exception {
        System.out.println("開始運(yùn)行一個(gè)線程");
        for(int i = 1, i < 10; i++) {
            System.out.println("運(yùn)行中");
        }
        // 阻塞該線程
        Thread.sleep(200);
        return 1;    // 返回線程的值
    }
}

接著創(chuàng)建Future對(duì)象,將用于啟動(dòng)子線程

package demo2;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class test {
    public static void main(String[] args) {
        // 先創(chuàng)建實(shí)例
        CallableDemo ctt = new CallableDemo();
        FutureTask ft = new FutureTask<>(ctt);    // 該方法為了獲取返回值而設(shè)定    
        new Thread(ft, "返回結(jié)果的值").start();
        try {
            System.out.println(ft.get());
        } catch (InterruptedException | ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package demo2;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class CallableDemo implements Callable{
    @Override
    public Integer call() throws Exception {
        System.out.println("開始運(yùn)行一個(gè)線程");
        for(int i = 1; i < 10; i++) {
            System.out.println("運(yùn)行中");
        }
        return 1;    // 返回線程的值
    }
}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72279.html

相關(guān)文章

  • Java線程學(xué)習(xí)(一)Java線程入門

    摘要:最近聽很多面試的小伙伴說,網(wǎng)上往往是一篇一篇的多線程的文章,除了書籍沒有什么學(xué)習(xí)多線程的一系列文章。將此線程標(biāo)記為線程或用戶線程。 最近聽很多面試的小伙伴說,網(wǎng)上往往是一篇一篇的Java多線程的文章,除了書籍沒有什么學(xué)習(xí)多線程的一系列文章。但是僅僅憑借一兩篇文章很難對(duì)多線程有系統(tǒng)的學(xué)習(xí),而且面試的時(shí)候多線程這方面的知識(shí)往往也是考察的重點(diǎn),所以考慮之下決定寫一系列關(guān)于Java多線程的文章...

    Donne 評(píng)論0 收藏0
  • Java線程專題一:并發(fā)所面臨的問題

    摘要:但是并不是什么多線程就可以隨便用,有的時(shí)候多線程反而會(huì)造成系統(tǒng)的負(fù)擔(dān),而且多線程還會(huì)造成其他的數(shù)據(jù)問題,下面就來介紹一下多線程面臨的問題。下面這張圖是多線程運(yùn)行時(shí)候的情況,我們發(fā)現(xiàn)上下文切換的次數(shù)暴增。 并發(fā)的概念: 在Java中是支持多線程的,多線程在有的時(shí)候可以大提高程序的速度,比如你的程序中有兩個(gè)完全不同的功能操作,你可以讓兩個(gè)不同的線程去各自執(zhí)行這兩個(gè)操作,互不影響,不需要執(zhí)行...

    madthumb 評(píng)論0 收藏0
  • Java線程可以分組,還能這樣玩!

    摘要:如圖所示,帶有的所有線程構(gòu)造方法都可以定義線程組的。線程組還能統(tǒng)一設(shè)置組內(nèi)所有線程的最高優(yōu)先級(jí),線程單獨(dú)設(shè)置的優(yōu)先級(jí)不會(huì)高于線程組設(shè)置的最大優(yōu)先級(jí)。 前面的文章,棧長和大家分享過多線程創(chuàng)建的3種方式《實(shí)現(xiàn) Java 多線程的 3 種方式》。 但如果線程很多的情況下,你知道如何對(duì)它們進(jìn)行分組嗎? 和 Dubbo 的服務(wù)分組一樣,Java 可以對(duì)相同性質(zhì)的線程進(jìn)行分組。 來看下線程類 Th...

    biaoxiaoduan 評(píng)論0 收藏0
  • JAVA 線程和并發(fā)基礎(chǔ)

    摘要:線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。在的線程中并沒有可供任何對(duì)象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發(fā)編程網(wǎng) - 鄭旭東 校對(duì):方騰飛 多...

    vboy1010 評(píng)論0 收藏0
  • Java線程學(xué)習(xí)(七)并發(fā)編程中一些問題

    摘要:相比與其他操作系統(tǒng)包括其他類系統(tǒng)有很多的優(yōu)點(diǎn),其中有一項(xiàng)就是,其上下文切換和模式切換的時(shí)間消耗非常少。因?yàn)槎嗑€程競爭鎖時(shí)會(huì)引起上下文切換。減少線程的使用。很多編程語言中都有協(xié)程。所以如何避免死鎖的產(chǎn)生,在我們使用并發(fā)編程時(shí)至關(guān)重要。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)syn...

    dingding199389 評(píng)論0 收藏0
  • 學(xué)習(xí)Java線程的一些總結(jié)

    摘要:多線程環(huán)境下的一些問題安全性問題在沒有正確同步的情況下,多線程環(huán)境下程序可能得出錯(cuò)誤的結(jié)果。一些相關(guān)概念競爭條件多線程的環(huán)境下,程序執(zhí)行的結(jié)果取決于線程交替執(zhí)行的方式。而線程的交替操作順序是不可預(yù)測(cè)的,如此程序執(zhí)行的結(jié)果也是不可預(yù)測(cè)的。 入口 Java多線程的應(yīng)用復(fù)雜性之如jvm有限的幾個(gè)內(nèi)存方面的操作和規(guī)范,就像無數(shù)紛繁復(fù)雜的應(yīng)用邏輯建立在有限的指令集上。 如何寫出線程安全的程序,有...

    coolpail 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<