java多线程编程—高级主题_Java day20 高级编程【第一章】Java多线程编程
【第一章】Java多線程編程
一.進程與線程
多個時間段會有多個程序依次執行,但是同一時間點只有一個進程執行
線程是在進程基礎之上劃分的更小的程序單元 ,線程是在進程基礎上創建并且使用的,所以線程依賴于進程的支持,但是來講,線程的啟動速度要比進程快許多,所以使用多線程進行并發處理的時候,執行的性能要高于進程。
二.Thread類實現多線程
如果想要在JAVA中實現多進程,就必須有一個專門的線程類進行線程執行任務的定義,而這個主體類的定義是有要求的,必須實現特定的接口或者繼承特定的父類才可以完成。
1.繼承Thread類實現多線程
java里面提供有一個java.lang.Thread的一個程序類,一個類只要繼承了此類,并且覆寫了Thread類中提供的run()方法,就表示這個類是線程的主體類,而這個方法就是線程的主方法。
范例:多線程主體類:
class Mythread extends Thread{ //線程主體類
privateString title;publicMythread(String title) {this.title =title;
}
@Overridepublic void run() { //線程主體方法
for (int x = 0; x<10;x++) {
System.out.println(this.title + "運行 x =" +x);
}
}
}
多線程要執行的功能都應該在run()方法中定義。需要說明的是,run方法不能夠被直接調用,因為這里面牽扯到一個操作系統的資源調度問題
,所以要想啟動多線程,必須使用start方法。
new Mythread("線程A").start();new Mythread("線程B").start();new Mythread("線程C").start();
在java程序執行的過程之中考慮到對于不同層次開發者的需求,所以支持有本地的操作系統函數調用,這個技術被稱為JNI(Java Native Interface Java本地接口)技術,而java中不推薦這樣使用。
而在Thread類里提供的start0()就表示需要將此方法依賴于不同的操作系統實現。
public synchronized voidstart() {if (threadStatus != 0)throw newIllegalThreadStateException();
group.add(this);boolean started = false;try{
start0();
started= true;
}finally{try{if (!started) {
group.threadStartFailed(this);
}
}catch(Throwable ignore) {
}
}
}private native void start0();
疑問:為什么必須使用start而不能使用run方法:
任何情況下只要定義了多線程,多線程的啟動永遠只有一種方案:Thread類中的start方法。
三.Runnable接口實現多線程
雖然可以通過Thread類的繼承來實現多線程的定義,但是在java程序中對于繼承永遠都是存在有單繼承局限的,所以在java又提供了第二種多線程的主體定義形式:
實現java.lang.Runnable,此接口定義如下:
@FunctionalInterfacepublic voidRunnable() {public voidrun();
}
范例:通過Runnable實現多線程(Thread?(Runnable target)):
class Mythread implements Runnable{ //線程主體類
privateString title;publicMythread(String title) {this.title =title;
}
@Overridepublic void run() { //線程主體方法
for (int x = 0; x<10;x++) {
System.out.println(this.title + "運行 x =" +x);
}
}
}public classThreadDemo {public static voidmain(String[] args) {
Thread threada= new Thread(new Mythread("線程對象A"));
Thread threadb= new Thread(new Mythread("線程對象B"));
Thread threadc= new Thread(new Mythread("線程對象C"));
threada.start();
threadb.start();
threadc.start();
}
由于此時只是實現了Runnable接口對象,此時線程主體就不再有單繼承的局限,這樣的設計才是標準的設計。
Runnable接口使用了函數式接口的定義,所以也可以直接使用Lambda表達式進行線程類實現。
范例:利用Lambda實現多線程定義:
public classThreadDemo {public static voidmain(String[] args) {for(int x = 0 ;x < 3 ; x++) {
String title= "線程對象-" +x;
Runnable run= ()->{for(int y = 0; y < 3 ; y++) {
System.out.println(title+ "運行 x =" +x);
}
};newThread(run).start();
}
}
}
在以后開發之中對于對線程的實現,優先考慮的就是Runnable接口實現,并且都是通過Thread啟動多線程
總結
以上是生活随笔為你收集整理的java多线程编程—高级主题_Java day20 高级编程【第一章】Java多线程编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java获取网络带宽_Linux Jav
- 下一篇: echarts数据怎么赋值 vue_vu