java基礎——執行緒的建立和狀態
阿新 • • 發佈:2018-11-24
目錄
前言
程序:記憶體執行的程式。
執行緒:程序中的一個執行單元。
建立多執行緒的方式
本質都是呼叫自己寫的run方法。
1繼承thread抽象類
Thread thread = new Thread(){ @Override public void run() { for(int i=0;i<10;i++){ System.out.println("執行緒建立的第一種方式:"+Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }; thread.start();
2實現Runnable介面
Thread thread2 = new Thread(new Runnable() { @Override public void run() { for(int i=0;i<10;i++){ System.out.println("執行緒建立的第二種方式:"+Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); thread2.start();
3實現Callable介面
FuttureTask繼承RunnableFuture,
RunnableFuture繼承runnable和future。
FutureTask<Integer> ft = new FutureTask<Integer>(new Callable<Integer>() { @Override public Integer call() throws Exception { int i = 0; for(;i<10;i++){ System.out.println("執行緒建立的第三種方式:"+Thread.currentThread().getName()); } return i; } }); new Thread(ft).start();
匿名內部類
改進實現runnable介面的形式
jdk8 lambda簡寫:
new Thread(()->{
System.out.println(123);
}).start();
完整版
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
}
}).start();
執行緒池
Executors建立執行緒池
阿里巴巴不推薦
ExecutorService service = Executors.newFixedThreadPool(2);
service.submit(new Runnable() {
@Override
public void run() {
System.out.println("新執行緒執行");
}
});
執行緒安全
多個執行緒同時對一個數據進行寫操作,會出現安全問題。
同步程式碼塊
所有執行緒都要使用同一把鎖,比如: ""
synchronized(同步鎖){
# 需要同步操作的程式碼
}
# 強制處於waiting狀態
同步鎖.waiting();
# 喚醒處於waiting狀態的執行緒來搶鎖:
同步鎖.notify();
同步方法
對於非static方法,同步鎖就是this。
對於static方法,我們使用當前方法所在類的位元組碼物件(類名.class)
public synchronized void method(){
可能會產生執行緒安全問題的程式碼
}
鎖機制
同理:一定要使用同一把鎖!!!
Lock lock = new ReentrantLock();
ExecutorService service = Executors.newFixedThreadPool(2);
service.submit(new Runnable() {
@Override
public void run() {
lock.lock();
System.out.println(123);
lock.unlock();
}
});