java基礎專欄—Thread

進程概述

正在運行的程序就是進程java

單線程不會出現安全問題,可是效率堪憂安全

  • 分時調度:每一個線程平均佔用CPU
  • 搶佔調度:優先級不一樣的線程能夠

Thread子類實現線程

  1. 繼承至Thread類,並重寫Thread方法的run()
  2. 將要執行的代碼放到run()中
  3. 建立子類對象,調用start(),屢次開啓線程是不合法的
  4. 執行具備隨機性

問什麼要繼承Thread類: 由於Thread類是線程類,繼承至Thread的類,能夠爲寫在run()的代碼塊提供一個模板。因此run是提供要運行的代碼,start()纔是開啓線程。多線程

線程的內存: 內存會在開闢一個棧區,而後讓run()進入到這個棧。棧內存都是線程私有的異步

Thread方法

public String getName():這是Thread的方法,並非子類的方法線程

public static Thread currentThread()code

public void setName(String name)用子類對象去調用這個方法對象

public void sleep(long second)==這個方法不能拋出異常,由於父類Thread不能拋出,因此子類也不能拋==繼承

Runnable

  • 實現了Runnable接口的類
  • 覆蓋run方法
  • 建立Thread類對象
  • 構造方法傳遞實現類,傳遞Runnable的接口實現類
  • 調用strat()
public subRunnable implements Runnable{
    public void run(){
        
    }
}
public static void main(String[] args){
    SubRunnable sr = new SubRunnable();
  	Thread th = new Thread(sr);
  	th.start();
}
  1. 接口解決了單繼承的侷限性
  2. 將任務對象,和線程對象分離

匿名內部類實現多線程

//匿名內部類是沒有子類的
//繼承方式 xxxclass extends Thread{public void run()}
//直接new Thread,這個匿名內部類就是Thread的子類
new Thread(){
    public void run(){
        
    }.start();
}
//匿名內部類實現類接口引用
Runnable r = new Runnable(){
    public void run(){
        
    };
  	new Thread(r).start;
}

new Thread(new Runnable(){
    public void run(){
        
    }
}).start();

線程池原理

​ 線程池就是用來存儲線程的容器,當線程沒又試用的時候就會將線程回收可是不關閉線程,能夠重複使用這個線程,節省掉反覆建立銷燬線程的內存開銷。sun公司在JKD1.5以後就提供了線程池的API接口

線程池這個容器都是由線程工廠生產的進程

|--Utils
	|--Executors
	
public static ExecutorService newFixedThreadPool(int nThreads)
  
ExecutorService:線程池接口
Future<?> submit(Runnable task)
Future<?> submit(Callable<?> task)
返回的是接口實際上是說返回的是這個接口的實現類ThreadPoolExecutor,讓這個類去實現run
ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(new Runnable());

es.shutdown();
//關閉線程池

Callable

Runnable接口存在的問題:

  1. run 方法是void的
  2. 不能排除異常
  3. 能夠用Callable<V>接口來解決,其使用的方式和Runnable同樣
  4. 重寫Callable的call()
ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(new Callable<?>());

//拿到返回值的方式Futere接口
Future<T> f = es.submit(new Callable<T>());
es.shutdown();
//關閉線程池

多線程異步計算實例

ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(task);
es.submit(task);
//能夠往構造器裏面傳入參數
相關文章
相關標籤/搜索