国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java 多線程

IamDLY / 3444人閱讀

摘要:總結創建線程,方法運行線程。創建線程使用繼承類實現創建線程文檔該類必須重寫方法。為新線程的入口點。中斷線程它表示一個線程被中斷,會拋出錯誤。

java多線程

關于內存

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

線程的生命周期

線程具有5種狀態,即新建,就緒,運行,阻塞,死亡。
新建,當new出來一個線程以后,jvm為其分配內存空間,并初始化成員變量的值
就緒,當線程調用了strat()方法的時候,線程就緒,會為其創建方法調用棧和程序計數器。

方法調用棧 即,記錄方法調用的次數
程序計數器 存放下一條單元指令的地方

運行;就緒狀態獲得cpu,開始執行run()方法
阻塞:例如進入I/O操作

新建,就緒

使用new關鍵字創建一個線程以后,該線程處于新建狀態,和其他java線程一樣,僅僅由java虛擬機為其分配內存,初始化變量成員的值。

運行和阻塞 線程調度

桌面和服務器使用搶占式調度策略,小型設備使用協作式調度策略,

線程阻塞

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

解除阻塞

依依對應即可

線程優先級

普通5,低1,高10
默認是5

關于start和run

start創建一個線程,由于是時間片運行的,所以需要run方法進行運行。
總結
start創建線程,run方法運行線程。

創建線程 使用Thread繼承類實現創建線程

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

本質上是Runnable接口的一種實現
package demo2;

public class test {
    public static void main(String[] args) {
        // 創建一個線程
        ThreadDemo run1 = new ThreadDemo();
        run1.start();// 啟動線程
        // 在運行線程以后,會不定時的jvm調用run方法,進行運行
    }
}
package demo2;

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

事實上父類的start方法也可以重寫

package demo2;

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

然后測試類

package demo2;

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

用于標記守護線程和用戶線程
用戶線程,平常創建的普通線程
守護線程,服務于用戶線程,不需要上層調用,例如gc垃圾回收為一個明顯的守護線程,mysql中也有執行定時任務的線程。

中斷線程

它表示一個線程被中斷,會拋出錯誤。

使用Runnable接口

文檔https://docs.oracle.com/javas...
屬于java.lang包內的,為自動默認加載的
該接口具有一個run方法,run方法為程序的入口
必須通過Thread類的構造方法實現啟動線程

package demo2;

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

public class demoRunnable implements Runnable{
    private int i;

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

使用Callable創建接口的實現類
接口源碼如下

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

實現了一個泛型,該并且返回該類型,需要實現call方法。使用包裝對象

關于包裝類型,即,將不是對象的內容包裝成為對象,為包裝類型,實現了對象的類型,為一個類

先實現Callable接口,其中的call類為程序的子線程的執行體

package demo2;

import java.util.concurrent.Callable;

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

接著創建Future對象,將用于啟動子線程

package demo2;

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

public class test {
    public static void main(String[] args) {
        // 先創建實例
        CallableDemo ctt = new CallableDemo();
        FutureTask ft = new FutureTask<>(ctt);    // 該方法為了獲取返回值而設定    
        new Thread(ft, "返回結果的值").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("開始運行一個線程");
        for(int i = 1; i < 10; i++) {
            System.out.println("運行中");
        }
        return 1;    // 返回線程的值
    }
}

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

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72279.html

相關文章

  • Java線程學習(一)Java線程入門

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

    Donne 評論0 收藏0
  • Java線程專題一:并發所面臨的問題

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

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

    摘要:如圖所示,帶有的所有線程構造方法都可以定義線程組的。線程組還能統一設置組內所有線程的最高優先級,線程單獨設置的優先級不會高于線程組設置的最大優先級。 前面的文章,棧長和大家分享過多線程創建的3種方式《實現 Java 多線程的 3 種方式》。 但如果線程很多的情況下,你知道如何對它們進行分組嗎? 和 Dubbo 的服務分組一樣,Java 可以對相同性質的線程進行分組。 來看下線程類 Th...

    biaoxiaoduan 評論0 收藏0
  • JAVA 線程和并發基礎

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

    vboy1010 評論0 收藏0
  • Java線程學習(七)并發編程中一些問題

    摘要:相比與其他操作系統包括其他類系統有很多的優點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。因為多線程競爭鎖時會引起上下文切換。減少線程的使用。很多編程語言中都有協程。所以如何避免死鎖的產生,在我們使用并發編程時至關重要。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關鍵字(1) java多線程學習(二)syn...

    dingding199389 評論0 收藏0
  • 學習Java線程的一些總結

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

    coolpail 評論0 收藏0

發表評論

0條評論

IamDLY

|高級講師

TA的文章

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