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

資訊專欄INFORMATION COLUMN

初識(shí)JAVA多線程編程

luzhuqun / 1436人閱讀

摘要:多線程術(shù)語辨析任務(wù)和線程是不同的中類本身不執(zhí)行任何操作它只驅(qū)動(dòng)賦予它的任務(wù)而才是定義任務(wù)的地方創(chuàng)建任務(wù)的方式有兩種實(shí)現(xiàn)接口中的方法查看源碼可以看到只有一個(gè)方法使用直接繼承即可這樣就創(chuàng)建了一個(gè)任務(wù)暗示調(diào)度器該線程可以讓出資源了中實(shí)現(xiàn)方法部分源

java多線程 1. 術(shù)語辨析

任務(wù)和線程是不同的,Java中Thread類本身不執(zhí)行任何操作,它只驅(qū)動(dòng)賦予它的任務(wù),而Runnable才是定義任務(wù)的地方.

2. 創(chuàng)建任務(wù)的方式有兩種 2.1 實(shí)現(xiàn)Runnable接口中的run方法

1.查看Runnable源碼,可以看到只有一個(gè)run()方法

   @FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface Runnable is used
     * to create a thread, starting the thread causes the object"s
     * run method to be called in that separately executing
     * thread.
     * 

* The general contract of the method run is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }

2.使用Runnable,直接繼承即可,這樣就創(chuàng)建了一個(gè)任務(wù).

public class MyRunnable implements Runnable{

    @Override
    public void run() {
        int i=0;
        while(true)
            System.out.println(i++);
    }
    //暗示調(diào)度器該線程可以讓出資源了
    Thread.yield();
}
2.2 Thread中實(shí)現(xiàn)run方法

1.Thread部分源碼

/*
 * @see     Runnable
 * @see     Runtime#exit(int)
 * @see     #run()
 * @see     #stop()
 * @since   JDK1.0
 */
public class Thread implements Runnable {
    /* Make sure registerNatives is the first thing  does. */
    private static native void registerNatives();
    static {
        registerNatives();
    }

2.可以看到Thread繼承了Runnable接口,所以Thread創(chuàng)建任務(wù)也是用的run方法
3.代碼可以這樣寫

class MyThread extends Thread{
    @Override
    public void run() {
        int count=10;
        while(count--!=0)
            System.out.print(count+" ");
    }
}
3. 運(yùn)行任務(wù)

1.不要誤會(huì),下面的方法并未啟動(dòng)一個(gè)線程,而是單純的調(diào)用了實(shí)現(xiàn)Runnable接口的MyRunnable的run()方法,所以該任務(wù)的運(yùn)行依舊被分派到該main線程中,不會(huì)獨(dú)立運(yùn)行在一個(gè)新線程里.

public class Main{
    public static void main(String[] args){
        Runnable runnable=new Runnable();
        runnable.run();
    }
}

2.調(diào)用Thread的start(),Thread中記錄了很多線程信息,包括線程名稱和優(yōu)先級(jí)等,以MyRunnable的實(shí)例作參傳入Thread,然后start即可運(yùn)行.

public static void main(String[] args){

Thread thread=new Thread(new MyRunnable);
thread.start()
}

3.在調(diào)用start()后,子線程不會(huì)因?yàn)橹骶€程代碼執(zhí)行結(jié)束而停止.

4. 使用執(zhí)行器(Executor)管理Thread.
public static void main(String[] args){

    //常見執(zhí)行器對(duì)象
    ExecutorService executorService= Executors.newCachedThreadPool();
    //向執(zhí)行器中添加任務(wù)
    executorService.execute(new MyRunnable());
    //關(guān)閉向執(zhí)行器中添加任務(wù);
    executorService.shutdown();

創(chuàng)建執(zhí)行器又三種類型可選,分別是newCachedThreadPool,newFixedThreadPool,newSingleThreadPool,區(qū)別如下

newCachedThreadPool:系統(tǒng)自動(dòng)調(diào)配線程池中的線程數(shù)量,并主動(dòng)復(fù)用已完成的線程資源.

newFixedThreadPool:可以自定義線程池中線程數(shù)量;

newSingleThreadPool:單例,線程池中只有一個(gè)線程,加載的任務(wù)會(huì)被排隊(duì),任務(wù)只能一個(gè)個(gè)依次完成.

5.線程的返回值

1.有些任務(wù)執(zhí)行完后需要返回值,那么創(chuàng)建任務(wù)時(shí)可以通過實(shí)現(xiàn)Callale接口而實(shí)現(xiàn)該目的,Callable是一種具有類型參數(shù)的泛型,因?yàn)榉祷刂凳切枰x類型的.

class Task implements Callable{

    @Override
    public String call() throws Exception {
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        TimeUnit.MILLISECONDS.sleep(100);
        return "線程執(zhí)行啦";
    }
}

2.然后在main()方法中接受返回值信息,對(duì)線程信息的管理可以用Future

public static void main(String[] args){
    ExecutorService executorService=Executors.newCachedThreadPool();
    Future future=executorService.submit(new Callable(){??? 
        @Override???
        public String call() throws Exception {
        return "執(zhí)行啦";???
        }
    });
    //判斷是否完成
    System.out.println(future.isDone());
    //任務(wù)完成后,才會(huì)打印詞條語句,否則會(huì)阻塞.
    System.out.println(future.get());
    //判斷是否完成
    System.out.println(future.isDone());
}
----------輸出----------
false
執(zhí)行啦
true

3.程序運(yùn)行到get()方法時(shí)會(huì)阻塞,當(dāng)運(yùn)行完后,主程序才會(huì)繼續(xù)向后執(zhí)行.

6. 程序的優(yōu)先級(jí)

1.優(yōu)先級(jí)的設(shè)置在run方法中

public void run(){

    //例如將優(yōu)先級(jí)設(shè)置為10
    Thread.currentThread().setPriority(10)
}

2.為了方便移植,建議將優(yōu)先級(jí)設(shè)置為Thread中的三個(gè)常量.

7. 后臺(tái)線程

1.設(shè)置后臺(tái)線程語法 thread.setDaemon(true);要在start()之前.
2.后臺(tái)線程創(chuàng)建的線程也為后臺(tái)線程.

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

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

相關(guān)文章

  • [初識(shí)C++] 何為最:心酸歷史

    摘要:上面需要了解的是這倆個(gè)版本都是破蛹成蝶的版本世界挑戰(zhàn)榜咋才前三還沒擠進(jìn)去呀,你想想世界上有幾千中編程語言,在其中脫穎出來,可以說是天之嬌子,鳳毛麟角了。支持正版圖靈上面買吧,如果沒錢買盜版吧學(xué)完以后買本正版支持一下,創(chuàng)作不易是吧 ...

    forrest23 評(píng)論0 收藏0
  • 線程三分鐘就可以入個(gè)門了!

    摘要:系統(tǒng)級(jí)線程核心級(jí)線程由操作系統(tǒng)內(nèi)核進(jìn)行管理。值得注意的是多線程的存在,不是提高程序的執(zhí)行速度。實(shí)現(xiàn)多線程上面說了一大堆基礎(chǔ),理解完的話。虛擬機(jī)的啟動(dòng)是單線程的還是多線程的是多線程的。 前言 之前花了一個(gè)星期回顧了Java集合: Collection總覽 List集合就這么簡單【源碼剖析】 Map集合、散列表、紅黑樹介紹 HashMap就是這么簡單【源碼剖析】 LinkedHashMa...

    awkj 評(píng)論0 收藏0
  • Java開發(fā)

    摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術(shù)并且有豐富的程序開發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問題在面試中經(jīng)常會(huì)被提到。將對(duì)象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對(duì)象稱之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時(shí)注解 Java 程序員快速上手 Kot...

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

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

0條評(píng)論

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